繁体   English   中英

Django:如何根据外键制作“ order by”过滤器

[英]Django: how to make an “order by” filter based on a foreign key

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

Conversation通过这样的messages产生了很多Message

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

...不会改变结果

尝试使用:

my_query.order_by('-conversations__date_last_modif')

因为您将related_name用作"conversations"

我正在手动执行此“排序”:首先按消息日期排序,然后为每条消息添加其对话的pk (如果尚未添加)。 我敢肯定这不是最优化的解决方案,因此,如果您有基于此(工作)解决方案的建议,我就是您的助手!

l = []
for m in Message.objects.filter(dst=p).order_by('-date_last_modif'):
    for c in m.conversations.all():
        if c not in l:
            l.append(c.pk)
conversations_read = [c for c in Conversation.objects.filter(pk__in=l)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM