Итак, у меня есть следующая модель в Django:
class MemberLoyalty(models.Model):
date_time = models.DateField(primary_key=True)
member = models.ForeignKey(Member, models.DO_NOTHING)
loyalty_value = models.IntegerField()
Моя цель состоит в том, чтобы все кортежи были сгруппированы по участнику с самой последней датой. Есть много способов сделать это, один из них использует подзапрос, который группирует участника по max date_time и фильтрует member_loyalty с его результатами. Рабочая sql для этого решения выглядит следующим образом:
SELECT
*
FROM
member_loyalty
WHERE
(date_time , member_id) IN (SELECT
max(date_time), member_id
FROM
member_loyalty
GROUP BY member_id);
Еще один способ сделать это - присоединиться к подзапросу.
Как я могу перевести это на django запрос? Я не смог найти ни способа фильтрации по двум полям с использованием IN, ни способа объединения с подзапросом с помощью оператора c ON, заданного спецификацией.
Я пробовал:
cls.objects.values('member_id', 'loyalty_value').annotate(latest_date=Max('date_time'))
Но он начинает группироваться по значению loyalty_value.
Также попытался создать подзапрос, но не может найти способ присоединить его или использовать его на фильтре:
subquery = cls.objects.values('member_id').annotate(max_date=Max('date_time'))
Также я использую Mysql, поэтому я не могу использовать метод .distinct ('param').