1

次の機能があるとします。

def select_queryset(value_to_decide_upon):
    """ this function returns either any of some querysets or nothing """

    if value_to_decide_upon == 1:
        return User._default_manager.all()
    elif value_to_decide_upon == 2:
        return User._default_manager.filter(pk__in=[some_more_values])

    elif value_to_decide_upon == n-1:
        return User._default_manager.all().order_by('?')
    elif value_to_decide_upon == n:
        return None

ここで質問です。この関数は、戻り値としてランダムに並べられたクエリセットを持ちます。

queryset = User._default_manager.all().order_by('?')

この関数の唯一の重要な点は、正しいクエリセットを返さなければならないということです。私ができるような方法でクエリセットにアクセスする方法はありますか?次のようにします。

class TestQuerysetSelection(TestCase):

    def test_return_value(self):
        # this, of course, will always fail:
        self.assertEqual(select_queryset(n-1),
                         User._default_manager.all().order_by('?') )

        # and this is not working as well
        self.assertEqual( templatetag.queryset.order_by, '?' )

では、他のすべてのクエリセットと比較するブルートフォースなしで、関数が正しいクエリセットを返すかどうかをテストするにはどうすればよいでしょうか?

4

3 に答える 3

4

最も率直な方法は、セット (順序付けされていない) を比較することだと思います。

self.assertEqual(
    set(select_queryset(n-1)),
    set(User._default_manager.all())
)
于 2012-04-16T12:48:03.357 に答える
1

order by をオーバーライドして pk でソートすることができるため、クエリセットにはランダムな順序ではなく順序があります。クエリセットを比較する最良の方法は何ですか。

class TestQuerysetSelection(TestCase):
    def test_return_value(self):
        # Add `order_by('id')` to sort by id
        self.assertEqual(select_queryset(n-1).order_by('id'),
                         User._default_manager.all().order_by('id') )
于 2012-04-16T12:21:52.793 に答える
1

試す

qs1.query.sql_with_params() == qs2.query.sql_with_params()
# or simply
str(qs1.query) == str(qs2.query) 
# for your code
self.assertEqual(select_queryset(n-1).query.sql_with_params(),
                 User._default_manager.all().order_by('?').query.sql_with_params())

さらに、これらのクエリセットを返すには、より簡潔な関数が必要だと思います。

于 2012-04-16T12:22:14.270 に答える