【问题标题】:Django: How to mangle through relationsDjango:如何破坏关系
【发布时间】:2020-08-23 19:46:08
【问题描述】:

我有一个 ModelA 的实例,想查询 ModelC 的所有实例,通过 ModelB 与 ModelA 相关。

ModelA -> 所有带有 FK rel_a = ModelA -> rel_c.all() 的 ModelB 实例

class ModelA(models.Model):
    # fields
    pass

class ModelB(models.Model):
    rel_a = models.ForeignKey('ModelA', ...)
    rel_c = models.ManyToMany('ModelC')
    # more fields

class ModelC(models.Model):
    # fields
    pass

我知道如何在 SQL 中执行此操作,但我真的不知道应该如何解开这些关系

【问题讨论】:

    标签: python sql django django-models


    【解决方案1】:

    您可以使用.filter(…) expression [Django-doc]查询:

    ModelC.objects.filter(<b>modelb__rel_a=<i>instance_of_modela</i></b>)

    您可以像@IainShelvington says 一样,使用.distinct() [Django-doc] 过滤掉重复项:

    ModelC.objects.filter(modelb__rel_a=<i>instance_of_modela</i>)<b>.distinct()</b>

    如果您在从ModelBModelCManyToManyField 中指定了related_query_name=… [Django-doc]related_name=… [Django-doc](所以rel_c),那么modelb 的名称被替换为那个,那么它是:

    ModelC.objects.filter(<b><i>related_relc</i>__rel_a=<i>instance_of_modela</i></b>).distinct()

    related_relcrelated_query_namerelated_namerel_c 字段中。

    【讨论】:

    • 可能值得一提的是,这可能会返回重复项,distinct() 可用于获得唯一结果
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2018-02-21
    • 2019-09-27
    • 2015-12-19
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多