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')
Run Code Online (Sandbox Code Playgroud)
我想根据附加到该主题的最新消息对象来获取所有主题的顺序.我执行了这个查询,但这并没有给出不同的查询集.
>> Topic.objects.order_by('-message__pub_date').distinct()
Run Code Online (Sandbox Code Playgroud)
你不需要distinct(),你需要的是聚合.此查询将执行您想要的操作:
from django.db.models import Max
Topic.objects.annotate(Max('message__pub_date')).order_by('-message__pub_date__max')
Run Code Online (Sandbox Code Playgroud)
虽然这是生产代码,但您可能希望遵循akaihola的建议并直接将"last_message_posted"非规范化为Topic模型.
此外,Message.pub_date的默认值存在错误.正如您现在所拥有的那样,无论何时第一次运行服务器并加载此代码,datetime.now()都将执行一次,该值将用作所有Messages的pub_date.使用它代替传递callable本身,以便在创建每个Message之前不调用它:
pub_date = models.DateTimeField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6021 次 |
最近记录: |