class Message(models.Model):
subject = models.CharField(max_length=100)
pub_date = models.DateTimeField(default=datetime.now())
class Topic(models.Model):
title = models.CharField(max_length=100)
message = models.ManyToManyField(Message, verbose_name='Discussion')
Я хочу упорядочить все темы в соответствии с последним объектом сообщения, прикрепленным к этой теме. Я выполнил этот запрос, но он не дает четкого набора запросов.
>> Topic.objects.order_by('-message__pub_date').distinct()
Ага! правильно, я это пропустил! Я добавил сейчас!






Вы найдете объяснение в документация для .distinct().
Я бы денормализовал, добавив поле modified_date к модели Topic и обновляя его всякий раз, когда сообщение сохраняется или удаляется.
Здесь вам не нужен отдельный (), вам нужен агрегирование. Этот запрос сделает то, что вы хотите:
from django.db.models import Max
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max')
Хотя, если это производственный код, вы, вероятно, захотите последовать совету акайхолы и напрямую перенормировать last_message_posted в модель Topic.
Кроме того, есть ошибка в вашем значении по умолчанию для Message.pub_date. Как и сейчас, всякий раз, когда вы впервые запускаете сервер и загружаете этот код, datetime.now () будет выполняться один раз, и это значение будет использоваться как pub_date для всех сообщений. Используйте это вместо этого, чтобы передать сам вызываемый объект, чтобы он не вызывался до тех пор, пока не будет создано каждое сообщение:
pub_date = models.DateTimeField(default=datetime.now)
Этот вопрос кажется неполным. Где использование .distinct (), которое, по вашему мнению, не работает? (Кстати, это работает).