Переопределение упорядочивания связанных объектов в наборе 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")
)