Получить уникальные записи из queryset

Есть модель.

class Document(models.Model):
    number = models.PositiveIntegerField()
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

В одной накладной может быть несколько наименований товаров. При Document.objects.all() получаются все записи. Как можно получить queryset только с уникальными номерами накладных? Например, было:

№1 кружка
№1 вилка
№2 табурет
№2 стол
№3 мяч

Нужно, чтобы получалось:

№1
№2
№3

Нужно использовать distinct()

Document.objects.order_by('number').distinct()

Корень проблемы в том, что у вас неправильно смоделирована предметная область. Вам нужна схема типа такой:

class Document(models.Model):
    number = models.PositiveIntegerField()

class DocumentItem(models.Model):
    document = models.ForeignKey(Document, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

Для накладной у вас одна запись в таблице документов, и несколько записей в таблице позиций DocumentItem, которая связывает накладную и товар. В этом случае Document.objects.all() вернет накладные без повторений.

Вернуться на верх