我有两个查询集:
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的角度来看,它必须是某种子查询,但我也无法弄清楚子查询的正确语法是什么。也许这个问题太宽泛了,但我仍然迷失在这些东西中。请耐心等待我!