【问题标题】:MultipleObjectsReturned in complex queryset while result should be uniqueMultipleObjectsReturned 在复杂查询集中,而结果应该是唯一的
【发布时间】:2018-05-14 12:29:11
【问题描述】:

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

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 是否正确?

不用过多打扰您的模型,下面是我生成 needsqueryset 的方法:

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)

感谢您的启发!

【问题讨论】:

  • 请注意,使用 needs = (own_needs | shared_needs).distinct() 可以按预期工作。我怀疑Django的union()还是有点新鲜。

标签: django django-models django-queryset


【解决方案1】:

联合可能会导致重复。尝试使用distinct,结果为queryset

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多