Queryset API Different () не работает?

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 (), которое, по вашему мнению, не работает? (Кстати, это работает).

Carl Meyer 19.01.2009 01:55

Ага! правильно, я это пропустил! Я добавил сейчас!

aatifh 19.01.2009 11:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
2
6 331
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы найдете объяснение в документация для .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)

Другие вопросы по теме