如何在Django中测试空查询集?
我正在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查询集与空列表进行比较 但由于这不是我非常喜欢的东西,我想知道是否有
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()
或者也很有用,您可以与实例0fdjango.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)