Queryset API Different () не работает? - PullRequest
6 голосов
/ 17 января 2009
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()

Ответы [ 2 ]

7 голосов
/ 24 января 2009

Здесь вам не требуется метод Земле (), вам нужно агрегация . Этот запрос будет делать то, что вы хотите:

from django.db.models import Max
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max')

Хотя, если это рабочий код, вы, вероятно, захотите последовать совету akaihola и денормализировать «last_message_posted» непосредственно в модель Topic.

Также в вашем значении по умолчанию для Message.pub_date есть ошибка. Теперь, когда вы впервые запускаете сервер и загружаете этот код, datetime.now () будет выполняться один раз, и это значение будет использоваться как pub_date для всех сообщений. Используйте это вместо того, чтобы передать сам вызываемый объект, чтобы он не вызывался до тех пор, пока не будет создано каждое сообщение:

pub_date = models.DateTimeField(default=datetime.now)
3 голосов
/ 20 января 2009

Вы найдете объяснение в документации для .distinct().

Я бы нормализовал, добавив поле modified_date к модели Topic и обновляя его всякий раз, когда сообщение сохраняется или удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...