我有一个Conversation
模型和一个Message
模型。 Message
有一个日期字段date_creation
。
Conversation
有许多类似Message
到messages
的内容:
class Message(models.Model):
date_last_modif = models.DateTimeField(auto_now=True)
src = models.ForeignKey('User', related_name='message_src')
dst = models.ForeignKey('User', related_name='message_dst')
is_read = models.BooleanField(default=False)
message = models.TextField(null=True, blank=True)
class Conversation(models.Model):
messages = models.ManyToManyField(Message, related_name='conversations')
我想做的是获取所有没有阅读消息的对话,先按最新消息排序。
所以这是我的第一个过滤器,它获取所有未读取消息的会话:
p = current_user # code omitted for sake of clarity
convs_not_read = Conversation.objects.filter(
Q(messages__dst=p, messages__is_read=False)).distinct()
请注意,我需要区分只能获得一次的会话ID,否则,如果有多个未读取的消息,您将获得与以下内容相同的ID阅读此对话中的消息。
从现在开始,我正在尝试让所有包含“无”未读取消息的会话,并通过最新消息对其进行排序。
我开始时:
convs_read = Conversation.objects
.filter(messages__dst=p)
.exclude(pk__in=convs_not_read.values_list('id', flat=True))
.distinct()
这样可行,但最新消息不会过滤它们。我被困在这里你会怎么做?
如果我尝试:在此查询中的任何位置添加.order_by('-messages__date_last_modif')
,则无效,此处:
.filter(messages__dst=p)
.order_by('-messages__date_last_modif')
.exclude(pk__in=convs_not_read.values_list('id', flat=True))
.distinct()
......或者在这里:
.filter(messages__dst=p)
.exclude(pk__in=convs_not_read.values_list('id', flat=True))
.distinct()
.order_by('-messages__date_last_modif')
...不会改变结果
答案 0 :(得分:0)
尝试使用:
my_query.order_by('-conversations__date_last_modif')
因为您使用related_name
作为"conversations"
答案 1 :(得分:-1)
我这样做&#34;排序&#34;手动:我首先按消息日期排序,然后对于每条消息,如果尚未添加,则添加其对话的[('test', {'FrameDistance': -0.0, 'RandomOffset': -0.0, 'ListOrder': 0, 'FrameOffset': -0.0, 'ObjectSelection': set([]), 'ObjectOrigin': (-0.0, -0.0, -0.0), 'Frames': defaultdict(<class '__main__._MovementInfo'>, {0: _MovementInfo(location=None, rotation=None, scale=None, visibility=None), 10: _MovementInfo(location=None, rotation=None, scale=None, visibility=None)}), 'Axis': (False, False, False), 'BounceDistance': -0.0})
。我非常确定这不是最优化的解决方案,所以如果你有任何建议 - 工作 - 解决方案,我是你的男人!
pk