Я пытаюсь получить максимальное значение от объединения результатов из двух отдельных таблиц. Я пытаюсь получить самый последний комментарий к сообщению. У меня есть модель Comment
, к которой может получить доступ Post.comments
. У меня также есть тело, отдельное от Post
, доступ к которому может получить Post.body
. И комментарии, и тело имеют поле when
, которое является DateTimeField
. Я хотел бы вернуть отсортированный набор запросов по самой последней активности, чтобы сначала отображалась запись с самым последним комментарием или телом.
Предположим, что модели выглядят так:
class Body(models.Model):
when = models.DateTimeField(default=datetime.datetime.now)
class Post(models.Model):
body = models.ForeignKey(Body)
class Comment(models.Model):
post = models.ForeignKey(Post, related_name='comments')
when = models.DateTimeField(default=datetime.datetime.now)
Я хотел бы, чтобы результат оставался набором запросов, если это возможно, поскольку я продолжаю его обрабатывать и далее передаю в средство разбивки на страницы, чтобы ограничить результаты.
В принципе, я хотел бы иметь возможность звонить:
q = Post.annotate(
activity=Max(
Union('comments__when', 'body__when')
)
)
q = q.order_by('-activity')
Но я не знаю, как осуществить этот Союз.
Я считаю, что SQL, который выполняет то, что я ищу, сравним с:
SELECT
...
IF(MAX(c.`when`), MAX(c.`when`), b.`when`) AS `activity`
...
FROM `post` p
...
LEFT OUTER JOIN `comment` AS c
ON c.`post_id`=p.`id`
LEFT OUTER JOIN `body` AS b
ON p.`body_id`=b.`id`
...
Можно ли выполнить такую индивидуальную аннотацию и соединение?