使用 select_related 获取 related_name 个对象

Using select_related to get related_name objects

我已经搜索了一段时间来解决我的问题,但我似乎无法解决这个问题。

所以我有两个模型:

class Messages(models.Model):
    _db = 'somedb'
    id = models.IntegerField(primary_key=True)
    text = models.TextField()

class MessageTags(models.Model):
    _db = 'somedb'
    id = models.IntegerField(primary_key=True)
    text = models.TextField()
    tag = models.ForeignKey(Tag)
    message = models.ForeignKey(Messages, related_name='tags')

我可以使用以下调用查询给定消息的标签: test = Messages.get(id=234124).tags.all() ^ returns MessageTags 列表

我想做的是在理论上执行左连接,我在其中获取特定条件的所有消息以及关联的 MessageTags 对象。我被指向使用 select_related 的方向,但我什么也做不了。

如何获取消息列表,将 MessageTags 作为每个消息的属性作为 .tags(或其他任何内容..)

谢谢!!

我不相信 select_related 能够按照您正在寻找的方法执行。但实际上,左连接也不会。

这样想:一条消息可以有 5 个标签。如果您进行联接,您将在结果集中为该一条消息获得 5 行,这使其看起来像 5 条消息。

现在,如您所述,您可以在单个消息上引用 .tags.all() 并获取与该消息关联的所有 MessageTag。如果我对你的情况理解正确的话,这实际上就是你要找的。

当然,如果您要优化执行的查询数量,我建议您查看 prefetch_related。以下是如何使用它的示例:

messages = Messages.objects.filter(text__icontains='foobar').prefetch_related('tags')
for message in messages:
    for tag in message.tags.all():
        print('Message id', message.id, '- tag', tag.text)

应该执行 2 个查询:

  1. 检索过滤后的邮件列表
  2. 检索与这些消息相关的所有标签