Django:prefetch_related(),m2m到关系v2

时间:2017-02-03 16:55:36

标签: python django many-to-many

我知道已有类似的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的特定实例获取每个Interaction的每个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'

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我在评论中借助于noamk找到了我自己问题的答案:

我没有考虑db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score中的get() - 方法每次调用时都会发出一个新查询(现在它很明显)。

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

如果某人仍然需要过滤{/ 3}},则应按照noamk

的建议使用