【问题标题】:Django Models - Relationship between siblings through a childDjango 模型 - 兄弟姐妹之间的关系通过一个孩子
【发布时间】:2020-10-20 07:50:05
【问题描述】:

我如何列出每个 MyModelA 的 MyModelB 对象,当它们的关系不是直接的,而是通过 MyModelC 时。

models.py

class MyModelA(models.Model):
    name = models.CharField(max_length=50)

class MyModelB(models.Model):
    name = models.CharField(max_length=50)

class MyModelC(models.Model):
    name = models.CharField(max_length=50)
    my_model_a = models.ForeignKey(MyModelA, on_delete=models.CASCADE)
    my_model_b = models.ManyToManyField(MyModelB)

my_model_b_list_of_each_c_for_each_a.html

{% for a in object_list %}

{% for c in a.my_model_c_set %}

{% for b in c.my_model_b_set %} # Can I list MyModelBs of each MyModelC?

{% endfor %}

{% endfor %}

{% endfor %}

【问题讨论】:

  • 你是什么意思所有 mymodelb 对于 mymodel a,它们不相关为什么他们会有任何相关的列表,看起来你做模型错了。为示例数据样本写一些额外的细节,而不是在 cmets 中,而是编辑帖子
  • 为什么不直接编辑问题并添加它,而不是添加带有道歉的评论。
  • 我有 3 个模型(A、B 和 C)。 A和B是兄弟姐妹。 C 对 A 有一个 ForeignKey,对 B 有一个 ManyToMany 字段。我的问题是:给定一个 A 列表,我可以遍历与 A 没有直接关系的 B 吗?我可以列出每个 A 到 C 的 B 吗?

标签: django relationship children siblings


【解决方案1】:

如果您只需要 ModelB 中的字段,您可以使用 values_list:

ModelA.objects.values_list('modelC__modelB__name', flat=True)
# <QuerySet ['aaa', 'bbb', ...] >

否则,您可以通过 id 在两个查询中获取模型:

ModelB.objects.filter(
    id__in=ModelA.objects.values_list(
        'modelC__modelB_id',
         flat=True
    )
)
# <QuerySet [<ModelB (1)>, <ModelB(2)]>

此外,如果您希望您的 ModelC 代表具有额外数​​据的多对多,您可以使用 through

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多