MultipleObjectsReturned в сложном наборе запросов, в то время как результат должен быть уникальным - PullRequest
0 голосов
/ 14 мая 2018

Я использую 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 с его строковым представлением?

Не беспокоя вас о моих моделях, вот как я генерирую набор запросов 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 голосов
/ 14 мая 2018

Объединение может привести к дублированию. Попробуйте использовать distinct с результатом queryset.

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