使用 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 个查询:
- 检索过滤后的邮件列表
- 检索与这些消息相关的所有标签
我已经搜索了一段时间来解决我的问题,但我似乎无法解决这个问题。
所以我有两个模型:
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 个查询:
- 检索过滤后的邮件列表
- 检索与这些消息相关的所有标签