Нужен ли django queryset.distinct(), если вы не используете queryset.values()?
Я пытаюсь разобраться с методом distinct в классе django queryset, но мне трудно понять, когда именно его использовать. Обратите внимание, что я не говорю о функции "distinct on" в postgres.
Я понимаю, что каждый экземпляр модели должен иметь свойство id, а id уникальны, поэтому при запросе экземпляров модели невозможно получить дубликаты моделей/строк. Так является ли следующее использование distinct избыточным?
User.objects.distict()
Я знаю, что одно правильное использование метода distinct - это когда вы используете метод values и не выбираете id, у вас могут быть значения, которые дублируются, и вы можете использовать distinct в таких сценариях.
есть ли другие сценарии, в которых может потребоваться использование distinct (например, при использовании select_related или prefetch_related)?
Обычно distinct()
используется для устранения дубликатов при фильтрации по нескольким таблицам
Рассмотрите следующие модели
class Parent(models.Model):
pass
class Child(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
value = models.IntegerField()
Наполнен следующими данными
p = Parent.objects.create()
Child.objects.create(parent=p, value=1)
Child.objects.create(parent=p, value=2)
Child.objects.create(parent=p, value=3)
Если фильтровать набор запросов Parent
по связанному столбцу value
, то вы получите дубликаты для каждого Child
, соответствующего фильтру
Parent.objects.filter(child__value__gt=0)
# <QuerySet [<Parent: Parent object (1)>, <Parent: Parent object (1)>, <Parent: Parent object (1)>]>
Parent.objects.filter(child__value__gt=1)
# <QuerySet [<Parent: Parent object (1)>, <Parent: Parent object (1)>]>
Но если вы используете distinct()
, то дубликаты будут устранены
Parent.objects.filter(child__value__gt=0).distinct()
# <QuerySet [<Parent: Parent object (1)>]>