【问题标题】:Django: prefetch_related() with m2m through relationship v2Django:prefetch_related() 与 m2m 通过关系 v2
【发布时间】:2017-02-03 16:55:35
【问题描述】:

我知道已经有类似的question,但我认为我的情况有点复杂,因为我有不同的入口点。

这些是我的模型:

class m_Interaction(models.Model):
  fk_ip = models.ForeignKey('m_IP', related_name="interactions")

class m_User(models.Model):
  name = models.CharField(max_length=200)

class m_IP(models.Model):
  fk_user = models.ForeignKey('m_User', related_name="ips" )

class m_Feature(models.Model):
  name = models.CharField(max_length=200)
  m2m_interaction = models.ManyToManyField(m_Interaction, related_name='features', through='m_Featurescore')

class m_Featurescore(models.Model):
  score = models.FloatField(null=False)
  fk_interaction = models.ForeignKey(m_Interaction, related_name='featurescore')
  fk_feature = models.ForeignKey(m_Feature, related_name='featurescore')

我从 m_User 开始,遵循 m_IP 与交互 (m_Interaction) 的反向关系。然后,我想为特定的 m_Feature 实例获取每个交互的每个 m_Featurescore.score。

我的工作查询以高效方式访问至少所有交互:

m_User.objects.all().prefetch_related('ips__interactions')

但我无法找出正确的“prefetch_related”语句来访问这样的 m_Featurescore.score

db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score

无需进行大量查询。

我已经尝试了以下几乎所有的组合:

'ips__interactions__features__featurescore'

有什么建议吗?

【问题讨论】:

  • “ips__interactions__featurescore”怎么样?此外,使用 get() 方法意味着您正在强制 ORM 进行查询。您需要使用 all() 方法才能利用预取。如果需要过滤,请使用 Prefetch() 对象。
  • @noamk 完美。谢谢!

标签: python django many-to-many


【解决方案1】:

我在 cmets 中的 noamk 的帮助下找到了我自己问题的答案:

我不认为db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score 中的 get() 方法会在每次调用时发出一个新查询(现在有点明显了)。

因此,我只是简单地重组了我的代码,现在我不再需要 get() 并且可以使用预取的好处。

如果有人仍然需要过滤 Prefetch()-object 应该按照 noamk 的建议使用

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2016-01-01
    • 2013-02-10
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多