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

f1tvaqid  于 2023-10-21  发布在  Go
关注(0)|答案(4)|浏览(126)

我正在测试Django中的一个视图,它应该从一个对象中删除所有标签。为此,我使用这个Assert:

self.assertEqual(list(Tag.objects.get_for_object(Animal.objects.get(pk=1))),[])

这很好,因为我得到了一个空列表作为回报。我把Django的queryset封装在一个列表中以避免这种情况:

AssertionError: [] != []

其中一个空的Django查询集与一个空的列表进行比较。
但由于这不是我喜欢的东西很多,我想知道是否有一个更好的方法来做这个测试。

jdg4fx2g

jdg4fx2g1#

使用exists即可

self.assertFalse(Tag.objects.get_for_object(Animal.objects.get(pk=1)).exists())
krugob8w

krugob8w2#

self.assertEqual(Tag.objects.get_for_object(Animal.objects.get(pk=1).count(), 0)

如果你想强制查询集作为一个列表来计算,你也可以使用len()
另外,assertQuerysetEqual也很有用,你可以与django.db.models.query.EmptyQuerySet的示例进行比较!但是在大多数情况下使用count()应该是最快的方法!

busg9geu

busg9geu3#

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

# 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)
lc8prwob

lc8prwob4#

正如@Bernhard所指出的,你可以使用self.assertQuerysetEquals,并将你的查询集与一个空的查询集进行比较,尽管这是一个优雅的解决方案,但它可能不是有效的。
其他解决方案也是有效的,但这里是我的:

self.assertEquals(Tag.objects.get_for_object(Animal.objects.get(pk=1), None)

我强烈建议不要转换列表中的django查询集。这是因为将查询集转换为列表需要将所有查询集加载到内存中,并在Python对象中进行转换。
为此目的,存在queryset方法count()exists()等。

相关问题