【问题标题】:select_related on many to many with custom through tableselect_related 多对多与自定义直通表
【发布时间】:2018-09-16 18:53:32
【问题描述】:

我有两个模型,Foo 和 Bar,我创建了一个多对多的关系,通过表 FooBar 自定义。

class Foo(models.Model):
    foofield = models.CharField()

class Bar(models.Model):
    barfield = models.CharField()
    foos = models.ManyToManyField('Foo', through='FooBar', related_name='foo_bar')

class FooBar(models.Model):
    foo = models.ForeignKey(Foo, related_name='foobar')
    bar = models.ForeignKey(Bar, related_name='foobar')
    foobarfield= models.CharField()

我想做的是显示给定 Foo 实例的所有 Bar 记录,并且对于每个这样的记录还显示 foobarfield 的相应值。所以我会得到类似的东西

  1. barfield_value1, foobarfield_value1
  2. barfield_value2, foobarfield_value2
  3. barfield_value3, foobarfield_value3
  4. ...

我似乎无法构建正确的查询来执行此操作。我尝试了类似的东西

Bar.objects.select_related('foobar').filter(foobar__foo = foo_instance)

因为我希望 foobar 对于 Foo 的给定实例是唯一的,但这似乎不起作用。如何获得我想要的结果?

【问题讨论】:

  • 你需要双下划线,所以foobar__foo=foo_instance
  • 此外,您需要在 prefetch 上进行注释或过滤。
  • 好的,我该怎么做呢?
  • 对于给定的 Foo 实例, foobar 如何是唯一的? Foo 和 Bar 通过 ManytoManyRelationship (FooBar) 关联。因此,对于给定的 Foo 实例,您可能在 FooBar 表中有多个 Bar 实例。

标签: django django-models


【解决方案1】:

由于FooBar 表中的每个相关行都有一个结果,并且由于您想访问该表中的字段 (foobarfield),因此最直接的方法是过滤 FooBar

foobars = FooBar.objects.select_related("bar").filter(foo=foo_instance)
for foobar in foobars:
    print(foobar.bar.barfield, foobar.foobarfield)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多