基于公共字段

时间:2017-02-12 20:50:39

标签: django orm django-queryset

我有两个查询集:

queryset 1:

[
   {'field_a': 12, 'field_b': 23}, 
   {'field_a': 24, 'field_b': 35},
]

queryset 2:

[
   {'field_a': 12, 'field_c': 32}, 
   {'field_a': 24, 'field_c': 43},
]

我的目标是根据公共字段(即left join)获取这两个查询集的field_a,以便结果如下所示:

 [
       {'field_a': 12, 'field_b': 23, 'field_c': 32}, 
 ]

关于我为什么需要这个的一些背景知识。 我有一个聊天应用程序,我在其中显示对话框列表。对于每个对话框,我希望用户看到最新消息和未读消息的数量。

以下是模型。

class Dialog(models.Model):
    pass

class Message(models.Model):
    dialog = models.ForeignKey(Dialog, ...) 
    text = models.TextField()
    is_read = models.BooleanField(default = False)

问题是我无法提出Message.objects.select_related('dialog').annotate(...)类型的单个查询,它会同时获取未读消息的数量和最新消息。

我使用以下代码获取每个对话框中的最后一条消息:

max_id_qs = Message.objects.values('dialog__id').\
                        annotate(max_id = Max('id'),).values('max_id')

qs = Message.objects.filter(id__in = max_id_qs).values('text')

我不知道如何在同一个查询集中获取未读消息的数量。从SQL的角度来看,它必须是某种子查询,但我也无法弄清楚子查询的正确语法是什么。也许这个问题太宽泛了,但我仍然迷失在这些东西中。请耐心等待我!

0 个答案:

没有答案