Django:如何根据外键

时间:2016-05-18 17:33:13

标签: python django

我有一个Conversation模型和一个Message模型。 Message有一个日期字段date_creation

Conversation有许多类似Messagemessages的内容:

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')

...不会改变结果

2 个答案:

答案 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