以下是我的模特目前的样子:
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,但我想避免这种情况,因为我不是很擅长。
非常感谢您的帮助。
答案 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')