关于相关模型的Django复杂排序

时间:2014-12-09 00:36:27

标签: python django

以下是我的模特目前的样子:

class Message(TimeStampedModel):
"""
A single exchange between two users. A set of messages related to a specific ticket constitutes a conversation
"""

conversation = models.ForeignKey(Conversation,
                                 blank=False,
                                 null=False,
                                 related_name='message',
                                 )

body = models.TextField(max_length=message_model_settings.get('BODY_MAX_LENGTH'))

is_read = models.BooleanField(blank=False,
                              null=False,
                              default=False)

datetime_read = models.DateTimeField(blank=True,
                                     null=True,
                                     default=None)


class Conversation(TimeStampedModel):
"""
Just a collection of messages between two users for a particular ticket
"""

sender = models.ForeignKey(User,
                           blank=False,
                           null=False,
                           related_name='sender',
                           )

receiver = models.ForeignKey(User,
                             blank=False,
                             null=False,
                             related_name='receiver',
                             )

ticket = models.ForeignKey(Ticket,
                           blank=False,
                           null=False
                           )

我需要返回一个所有属于单个用户的会话QuerySet,这些会话按降序排序,其中键是每个特定会话对象的所有消息集中最早的消息creation_date(在TimeStampModel中定义)。

因此,我需要为给定用户抓取一个对话,然后获取所有相关消息,查找哪个消息具有最新创建日期,然后为该用户的每个对话执行此操作,以便我可以使用该创建日期来对话。

我一直在寻找使用经理的时刻,但老实说我不确定这是最好的方式。我还注意到一个名为“order_with_respect_to”的选项。我可以通过这种方式订购有关消息创建日期的对话吗?最糟糕的情况我将需要编写原始SQL,但我想避免这种情况,因为我不是很擅长。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这比那更容易。您可以使用注释来获取最小创建日期,然后对注释进行排序:

from django.db.models import Min, Q

conversations = Conversation.objects.filter(Q(sender=user) | Q(receiver=user)) \
                                    .annotate(min_date=Min('message__creation_date')) \
                                    .order_by('-min_date')