首页 > 解决方案 > Django:来自另一个表的 order_by 列

问题描述

我正在建立一个论坛并拥有下一个消息模型:

class Message(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField(max_length=100000)
    date_publication = models.DateTimeField(auto_now_add=True)


class Discussion(Message):
    title = models.CharField(max_length=500)
    views = models.PositiveBigIntegerField(default=0)


class Response(Message):
    topic = models.ForeignKey(Discussion, on_delete=models.CASCADE)
    reply_to = models.ForeignKey(
        Message, on_delete=models.CASCADE, related_name='message_replied', null=True)

我想知道如何从响应中获取讨论 order_by date_publication 的列表。

标签: pythondjango

解决方案


您可以通过以下方式订购:

from django.db.models import Max
from django.db.models.functions import Coalesce

Discussion.objects.alias(
    latest_reply=Coalesce(Max('response__reply_to__date_publication'), 'date_publication')
).order_by('-latest_reply')

或者对于及更早版本:

from django.db.models import Max
from django.db.models.functions import Coalesce

Discussion.objects.annotate(
    latest_reply=Coalesce(Max('response__reply_to__date_publication'), 'date_publication')
).order_by('-latest_reply')

推荐阅读