如何在Django中测试空查询集?

如何在Django中测试空查询集?,django,unit-testing,Django,Unit Testing,我正在Django中测试一个视图,它应该删除对象中的所有标记。为此,我使用以下断言: self.assertEqual(list(Tag.objects.get_for_object(Animal.objects.get(pk=1))),[]) 这很好,因为我得到了一个空列表作为回报。我将Django queryset包装在一个列表中以避免这种情况: AssertionError: [] != [] 其中,将空的Django查询集与空列表进行比较 但由于这不是我非常喜欢的东西,我想知道是否有

我正在Django中测试一个视图,它应该删除对象中的所有标记。为此,我使用以下断言:

self.assertEqual(list(Tag.objects.get_for_object(Animal.objects.get(pk=1))),[])
这很好,因为我得到了一个空列表作为回报。我将Django queryset包装在一个列表中以避免这种情况:

AssertionError: [] != []
其中,将空的Django查询集与空列表进行比较

但由于这不是我非常喜欢的东西,我想知道是否有更好的方法来做这个测试

self.assertEqual(Tag.objects.get_for_object(Animal.objects.get(pk=1).count(), 0)
如果要强制将查询集作为列表进行计算,还可以使用
len()

或者也很有用,您可以与实例0f
django.db.models.query.EmptyQuerySet
进行比较!但是在大多数情况下,使用
count()
应该是最快的方法

只要使用


克里斯的回答在这种情况下有效。但是,您也可以使用:

# the_list = list(some_queryset)   # converting a queryset into a list
self.assertEqual(len(the_list), 0)

# to go directly from queryset:
self.assertEqual(some_queryset.count(), 0)

正如@Bernhard所指出的,您可以使用self.assertQuerySetQuals,并将查询集与空查询集进行比较,尽管这是一个优雅的解决方案,但可能并不高效

其他解决方案也是有效的,但以下是我的:

self.assertEquals(Tag.objects.get\u for_对象(Animal.objects.get(pk=1),None)
我强烈建议不要在列表中转换django queryset,因为将queryset转换为列表需要在内存中加载所有queryset并在Python对象中转换

为此,存在queryset方法
count()
exists()

# the_list = list(some_queryset)   # converting a queryset into a list
self.assertEqual(len(the_list), 0)

# to go directly from queryset:
self.assertEqual(some_queryset.count(), 0)