MultipleObjects在复杂查询集中返回,而结果应该是唯一的

时间:2018-05-14 12:29:11

标签: django django-models django-queryset

我正在使用Django 2.0,并遇到从两个查询集的union()生成的查询集needs遇到的奇怪问题:

needs.get(pk="3fbdcc49-2f06-46ea-a0a3-587ac5aaf50f")
---------------------------------------------------------------------------
MultipleObjectsReturned                   Traceback (most recent call last)
<ipython-input-29-300ad17a22c2> in <module>()
----> 1 needs.get(pk="3fbdcc49-2f06-46ea-a0a3-587ac5aaf50f")

/usr/local/lib/python3.6/site-packages/django/db/models/query.py in get(self, *args, **kwargs)
    405         raise self.model.MultipleObjectsReturned(
    406             "get() returned more than one %s -- it returned %s!" % 
--> 407             (self.model._meta.object_name, num)
    408         )
    409 

并使用相同的查询集:

for n in needs:
    print(n.pk)

3fbdcc49-2f06-46ea-a0a3-587ac5aaf50f
7c134214-6309-4881-b381-016cc00a31a5

所以:needs是一个包含两个对象的查询集,其中一个对象的主键(UUID)设置为3fbdcc49-2f06-46ea-a0a3-587ac5aaf50f。但是get()函数引发了MultipleObjectsReturned。

知道导致这种行为的原因是什么?查找带字符串表示的UUID是正确的吗?

我的模型没有太多困扰你,这就是我生成needs查询集的方法:

own_needs = models.Need.objects.filter(owner="bfd8e679-7660-4dcd-83bd-614fbd99b506")
mandate=models.ListMandate.objects.get(mandated=user1, permission=models.ListMandate.CAN_BUY_NEEDS, revoked_on=None)
shared_needs=models.Need.objects.filter(list=mandate.target)
needs = own_needs.union(shared_needs)

感谢您的启发!

1 个答案:

答案 0 :(得分:0)

联盟可能会导致重复。尝试将distinct与结果queryset一起使用。

needs = own_needs.union(shared_needs).distinct()