MultipleObjectsReturned:get()返回多个Feed - 它返回2

时间:2017-10-24 08:24:45

标签: django testing

我正在为django-model编写一些简单的测试,我只是使用assertEqualassertNotEqual。 现在我还没有完全掌握在这种情况下如何测试BooleanField。我有一个model字段,如下所示:

duplicate = models.BooleanField(default=False)

我正在为此编写测试,只是为了检查它是否相等:

def test_feed_duplicate_create(self):
    stefan_feed_duplicate = Feed.objects.get(duplicate='False')
    milan_feed_duplicate = Feed.objects.get(duplicate='False')
    self.assertEqual(
        stefan_feed_duplicate.duplicate, 'False'
    )
    self.assertEqual(
        milan_feed_duplicate.duplicate, 'False'
    )

但我面临的错误是:

(venv) vagrant@jessie:/var/www/vhosts/bspotted.net/app$ ./manage.py test --keepdb socialmedia
nosetests socialmedia --verbosity=1
Using existing test database for alias 'default'...
............E....................
======================================================================
ERROR: test_feed_duplicate_create (app.socialmedia.tests.test_feed_model.CommentsTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/var/www/vhosts/bspotted.net/app/socialmedia/tests/test_feed_model.py", line 225, in test_feed_duplicate_create
    stefan_feed_duplicate = Feed.objects.get(duplicate='False')
  File "/var/www/vhosts/bspotted.net/venv/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/var/www/vhosts/bspotted.net/venv/lib/python3.4/site-packages/django/db/models/query.py", line 338, in get
    (self.model._meta.object_name, num)
socialmedia.models.feed.MultipleObjectsReturned: get() returned more than one Feed -- it returned 2!

----------------------------------------------------------------------
Ran 33 tests in 0.159s

有人可以解释一下在这种情况下测试BooleanField的正确方法是什么?感谢。

2 个答案:

答案 0 :(得分:2)

get()中指定的选择选择了多个对象时,通常就是这种情况。在您的情况下,多个对象符合标准duplicate == False

get()只应在您确定只返回一个结果时使用,例如使用id作为选择器。

在您的情况下,当您预期会有多个结果时,可以使用filter()代替get()。但是,filter()不返回对象,而是返回QuerySet。因此,您必须调整断言以比较QuerySet

的条目

答案 1 :(得分:2)

get的{​​{1}}方法正好返回1(一)条目。如果它无法检索条目,它将抛出错误,如果它检索多个条目,则会抛出错误。

如果您希望有多个条目,或者最终没有条目,则应使用QuerySet方法,该方法会返回filter

在您的特定情况下,您无法根据字段QuerySet检索一个条目。它是duplicate,其中的条目值为BooleanField,条目的值为True

您必须根据其他字段检索Falsestefan的特定条目。