【问题标题】:Django - Append a related field to a querysetDjango - 将相关字段附加到查询集
【发布时间】:2012-01-01 12:30:51
【问题描述】:

我有两个模型:

class A(models.Model):
    # fields

class B(models.Model):
    a       = models.ForeignKey(A)
    name    = models.CharField(max_length=64)

除了来自 B 的相关对象之外,我想做的是从 A 获取过滤后的查询集,并将它们附加到来自 A 的查询集,这样我就可以通过这种方式访问​​ name 字段:A.B.name

知道怎么做吗?

【问题讨论】:

  • 您确定您不喜欢独立获取查询集然后将它们组合在一起,如stackoverflow.com/questions/431628/…
  • 如果我过滤我的 A 模型,然后将它与 B 结合会怎样?我将如何在这两个模型之间建立联系?看起来链只是盲目地连接所有元素:docs.python.org/library/itertools.html#itertools.chain
  • 是的,似乎链仅连接您的查询集。但是如果你做这样的事情呢:B.objects.filter(a__some_field_of_A = 'string').然后假设你有一个你想要的来自 B 的实例 b 。然后你会这样做:b.a_set.filter(name='somethingelse')。综上所述,你通过 A 求出满足某个条件的 B 的实例,然后取一个或多个,求出其他条件下 B 中包含的 A 的所有实例。这是两个类之间的关系,但我不知道你会发现它有多大用处。无论如何,A.B 不是一个选项。
  • 我已经这样做了,谢谢。

标签: django models django-queryset


【解决方案1】:

问题在于,由于关系是一对多的,A 不只有一个B,而是一个b_set

你可以这样:

for b in a.b_set.all():
    b.name

但你不能只引用B,因为这个概念不存在。但是,如果您使用了 OneToOneField。然后你可以轻松做到:

a.b.name

因为每个A 只有一个B。但是,您必须在发生实际关系之后对对象进行建模,而不是更喜欢 api 的工作方式。

【讨论】:

  • 实际关系是OneToMany。我需要做些什么才能使用:a.b_set.all()?我试过了,但它看起来不像 ab_set
  • b_set 将是自动创建的关系。除非您分配了 related_name,否则它将在那里,在这种情况下,它将是 related_name 值。
猜你喜欢
  • 2013-12-07
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2021-09-01
  • 2019-07-02
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多