Python Queryset API distinct()不起作用?
我想根据附加到该主题的最新消息对象对所有主题进行排序。 我执行了这个查询,但没有给出不同的查询集Python Queryset API distinct()不起作用?,python,django,Python,Django,我想根据附加到该主题的最新消息对象对所有主题进行排序。 我执行了这个查询,但没有给出不同的查询集 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_leng
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')
你可以在表格中找到解释 我会通过在
主题
模型中添加一个modified_date
字段,并在保存或删除消息时对其进行更新来取消规范化。这里不需要distinct(),您需要的是。此查询将执行您想要的操作:
>> Topic.objects.order_by('-message__pub_date').distinct()
虽然如果这是生产代码,您可能希望遵循akaihola的建议,直接将“last_message_posted”非规范化到主题模型上
此外,Message.pub_date的默认值中还有一个错误。现在,每当您第一次运行服务器并加载此代码时,datetime.now()将执行一次,该值将用作所有消息的发布日期。改为使用此选项传递callable本身,以便在创建每条消息之前不会调用它:
from django.db.models import Max
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max')
这个问题似乎不完整。您认为不起作用的.distinct()的用法在哪里?(顺便说一句,它确实有效)是的!对,我错过了!我现在加上!
pub_date = models.DateTimeField(default=datetime.now)