有多少种方法可以使用 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 【问题描述】:假设我有一个名为 A
和 B
的模型。在模型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) 关系