Нужен ли 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)>]>
Вернуться на верх