Queryset API distinct()不工作?

2024-05-11 10:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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') 

我想根据附加到该主题的最新邮件对象对所有主题进行排序。 我执行了这个查询,但是没有给出不同的queryset。

>> Topic.objects.order_by('-message__pub_date').distinct()

Tags: defaultmessage主题datetopicmodelmodelslength
2条回答

你可以在documentation for ^{}中找到解释。

我将通过在Topic模型中添加一个modified_date字段并在保存或删除消息时更新它来取消规范化。

这里不需要distinct(),需要的是aggregation。此查询将执行您想要的操作:

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

尽管这是生产代码,但您可能希望遵循akaihola的建议,并将“last_message_posted”直接反规范化到主题模型上。

此外,Message.pub_date的默认值也有错误。现在,每当您第一次运行服务器并加载此代码时,datetime.now()将执行一次,该值将用作所有消息的发布日期。请改为使用此选项传递可调用自身,以便在创建每个消息之前不会调用它:

pub_date = models.DateTimeField(default=datetime.now)

相关问题 更多 >