У меня есть следующие 2 модели Django:Почему Django QuerySet с выражением Q() возвращает повторяющиеся значения?
from mptt.models import MPTTModel, TreeForeignKey
from django.db import models
from django.db.models import Q
class Model1(MPTTModel):
random_field = models.IntegerField()
parent = TreeForeignKey('self', null=True, blank=True)
class Model2(models.Model):
model_1 = models.ManyToManyField(Model1)
@staticmethod
def descendants_queryset(model1):
q = Q()
for curr_descendant in model1.get_descendants:
q |= Q(model_1=curr_descendant)
return q
я создал экземпляры, как это:
>>> a = Model2.objects.create()
>>> b = Model1.objects.create(random_field=1, parent=None)
>>> c = Model1.objects.create(random_field=2, parent=b)
>>> d = Model1.objects.create(random_field=3, parent=b)
>>> a.model_1.add(c)
>>> a.pk
3
Когда я нормальный QuerySet фильтр и, когда я использую Q() выражение оно производит Такие же результаты (как и ожидалось):
>>> [i.pk for i in Model2.objects.filter(pk=3)]
[3]
>>> [i.pk for i in Model2.objects.filter(Model2.descendants_queryset(b), pk=3)]
[3]
Но когда я добавить еще один экземпляр Model1 к ManyToMany отношений, я вижу странное дублирование только тогда, когда Я фильтрую с использованием выражения Q():
>>> a.model_1.add(d)
>>> [i.pk for i in Model2.objects.filter(pk=3)]
[3]
>>> [i.pk for i in Model2.objects.filter(Model2.descendants_queryset(b), pk=3)]
[3, 3]
Я смущен, почему это дублирование происходит. Мне кажется, что это ошибка. Я, очевидно, обойдусь, добавив .distinct()
в запрос. Но похоже, что это не обязательно. Почему это происходит и что является правильным решением?