gpt4 book ai didi

django - 使用 select_related 获取 related_name 对象

转载 作者:行者123 更新时间:2023-12-04 02:17:00 27 4
gpt4 key购买 nike

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

所以我有两个模型:

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()^ 返回 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个查询:
  • 检索过滤后的邮件列表
  • 检索与这些消息相关的所有标签
  • 关于django - 使用 select_related 获取 related_name 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224827/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com