Django order_by ForeignKey设置模型

时间:2012-03-01 07:29:10

标签: python django

我有以下django模型

class Post(models.Model):
    title = models.CharField(max_length=240)

class Comment(models.Model):
    post = models.ForeignKey(Post)
    date = models.DateTimeField(auto_now_add=True)

我需要一个评论的QuerySet,先按邮件排序,然后按日期排序。 但帖子必须按其最新评论排序。

如果我可以在QuerySet order_by中使用模型方法,它将是这样的:

class Post(models.Model):
    title = models.CharField(max_length=240)

    def get_last_comment_date(self):
        return self.comment_set.order_by('-date')[0].date

我需要的顺序可能是:

Comment.objects.all().order_by('post__get_last_comment_date', '-date')

但不幸的是,不允许使用order_by中的方法。

请帮忙。我可以订购吗?

1 个答案:

答案 0 :(得分:4)

您不能在order_by lookups中使用方法,因为它们会转换为SQL

那么,为什么不将get_last_comment_date转换为字段?例如使用signal receiver

from django.db.models import signals

class Post(models.Model):
    title = models.CharField(max_length=240)
    last_comment_date = models.DateField(null=True, blank=True)

def post_last_comment_date(sender, instance=None, **kwargs):
    try:
        last_comment_date = self.comment_set.order_by('-date')[0].date
    except Comment.DoesNotExist:
        return

    if last_comment_date != comment.post.last_comment_date:
        comment.post.last_comment_date = last_comment_date
        comment.post.save()

signals.post_save.connect(post_last_comment_date, sender=Comment)

现在,您可以:Comment.objects.order_by('post__last_comment_date', '-date')