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