Переопределение упорядочивания связанных объектов в наборе queryset

У меня есть две связанные модели, Customer и Config. Клиент настроен на автоматический заказ по order. Теперь я хочу выбрать самую позднюю запись Config для каждого отдельного набора customer и report_type.

Обычно для этого используется order_by по всем отдельным полям, а также нисходящий порядок по дате, за которым следует distinct по отдельным полям.

Однако, поскольку в конечном запросе Django вставляет еще один ORDER BY на Customer.order, DISTINCT говорит, что его аргументы не совпадают с аргументами ORDER BY. В этом случае я хотел бы отменить упорядочивание в Customer.

class Customer(models.Model):
    name = models.TextField()
    order = models.IntegerField()

    class Meta:
        ordering = ["order"]


class Config:
    customer = models.ForeignKeyField(Customer)
    created = models.DatetimeField()
    report_type = models.TextField()

cfgs = (
    Report.objects
    .filter()
    .order_by("customer", "report_type", "-created")
    .distinct("customer", "report_type")
)

Есть решение, хотя, на мой взгляд, оно немного халтурное. Выполняя вызовы order_by и distinct на поле customer_id, он не будет пытаться LEFT JOIN Customer, а также откажется от его упорядочивания.

Проблема в том, что это означает, что мне придется сделать еще один вызов базы данных, чтобы получить объекты Customer. Это не страшно, но если бы я мог переопределить упорядочивание на Customer, это было бы намного лучше.

cfgs = (
    Report.objects
    .filter()
    .order_by("customer_id", "report_type", "-created")  # using customer_id instead of customer works
    .distinct("customer_id", "report_type")
)
Вернуться на верх