有多少种方法可以使用 Django ORM 获取 ManyToMany 字段数据

Posted

技术标签:

【中文标题】有多少种方法可以使用 Django ORM 获取 ManyToMany 字段数据【英文标题】:In how many ways I can get ManyToMany field data using Django ORM 【发布时间】:2021-08-29 19:33:50 【问题描述】:

假设我有一个名为 AB 的模型。在模型B 我有ManyToMany 字段来建模A 所以我可以通过多少种方式从模型A 使用模型B 获取数据

class A(models.Model):
    name= models.CharField(...)

class B(models.Model):
    a= models.ManyToManyField(A)

【问题讨论】:

所以你有一个来自模型 A 的模型 object,并且你想检索 related B 对象? 没有来自模型B 我想获取模型A的所有数据 所有数据,还是所有相关数据? 意味着我可以访问模型A中的所有字段 【参考方案1】:

最直接的两种方法是通过访问B的模型对象的a管理器,所以:

<i>model_b_object</i>.<b>a</b>.all()

另一种检索相关对象的方法是过滤B 模型,因此:

A.objects.filter(<b>b=<i>model_b_object</i></b>)

如果你定义了一个 through 模型,例如:

class A(models.Model):
    name= models.CharField(...)

class B(models.Model):
    a= models.ManyToManyField(
        A
        through='C'
    )

class C(models.Model):
    a = models.ForeignKey(A, on_delete=models.CASCADE)
    b = models.ForeignKey(B, on_delete=models.CASCADE)

那么您也可以通过以下方式访问它:

A.models.objects.filter(<b>c__b=<i>model_b_object</i></b>)

但这只会使 ORM 调用更复杂,可读性更差。

【讨论】:

感谢您的回答。没有别的办法吗? @AnkitTiwari:不会导致糟糕的性能和代码。 @AnkitTiwari:或者正如 Python 之禅 所说:应该有一种——最好只有一种——明显的方法。 谢谢@WillemVanOnsem,我看到了很多你的答案,其中一些对我帮助很大。

以上是关于有多少种方法可以使用 Django ORM 获取 ManyToMany 字段数据的主要内容,如果未能解决你的问题,请参考以下文章

django 视图 使用orm values_list()方法获取指定字段的数据

Django:获取每个用户的发票、费用、提款。 (ORM) 关系

使用 Django 的 ORM 和 Django Rest Framework 序列化嵌套关系的查询集的正确方法?

Django ORM - 喜欢的百分号

django_orm 基本操作

Django框架之ORM的相关操作之多对多三种方式