【问题标题】:How can i test for an empty queryset in Django?如何在 Django 中测试空查询集?
【发布时间】:2012-03-29 00:24:18
【问题描述】:

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

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

这很好,因为我得到一个空列表作为回报。我将 Django 查询集包装在一个列表中以避免这种情况:

AssertionError: [] != []

将空的 Django 查询集与空列表进行比较。

但由于这不是我很喜欢的东西,我想知道是否有更好的方法来进行测试。

【问题讨论】:

    标签: django unit-testing


    【解决方案1】:

    只需使用exists

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

    【讨论】:

      【解决方案2】:
      self.assertEqual(Tag.objects.get_for_object(Animal.objects.get(pk=1).count(), 0)
      

      如果您想强制将查询集评估为列表,也可以使用len()

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          正如@Bernhard 指出的那样,您可以使用self.assertQuerysetEquals,并将您的查询集与空查询集进行比较,虽然这是一个优雅的解决方案,但可能效率不高。

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

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

          我强烈建议不要在列表中转换 django 查询集。这是因为将查询集转换为列表需要将所有查询集加载到内存中并将其转换为 Python 对象。

          为此存在查询集方法count()exists() 等。

          【讨论】:

            猜你喜欢
            • 2020-06-05
            • 1970-01-01
            • 2013-11-26
            • 2014-08-28
            • 2010-11-26
            • 2017-05-05
            • 2021-09-28
            • 2013-04-22
            • 2012-04-14
            相关资源
            最近更新 更多