django - 使用桥接表的多对多关系的 Django QuerySet
问题描述
我是 Django 新手,正在寻找一种使用中间表检索和发布到多对多关系的有效方法。
楷模:
from django.db import models
# Create your models here.
class Actor(models.Model):
name = models.CharField(max_length = 50, primary_key = True)
bio = models.CharField(max_length=150)
class Movie(models.Model):
name = models.CharField(max_length=100)
release = models.CharField(max_length=100)
class NormActors(models.Model):
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
actor = models.ForeignKey(Actor, on_delete=models.CASCADE)
我已经检查了文档并且它变得混乱,所以任何参考都会有所帮助。如果应要求,我想发送 -
- for /movies:获取所有电影的列表 + 包含相应电影中演员姓名的详细信息
- for /actors:获取所有演员的列表+他们参加过的电影的详细信息
ORM 查询应该是这样的吗?
actor = Actor.objects.get(name="XYZ")
movies = actor.movie_set.all()
我应该如何处理第一个?
解决方案
首先,您应该显式声明 m2m 并如下标识直通表:
class Movie(models.Model):
...
actors = models.ManyToManyField('Actor', through='NormActor')
现在,你可以拍任何电影,也可以拍movie.actors.all()
任何演员actor.movie_set.all()
。
请注意,如果您在 NormActor 上只有这两个字段,则实际上不需要显式声明它;您可以删除该模型和through
属性,Django 将为您管理它,另外还有一个好处是在管理界面中您现在可以编辑与电影内联的演员。
推荐阅读
- python - 如何根据多个条件用字符串拆分 Pandas 数据框列
- javascript - 查询特定词节点js snoowrap
- postgresql - Ubuntu 上的 PostgreSQL - 这些僵尸进程是什么以及导致它们停留太长时间的原因
- rust - 无法在提交 43a74718 处编译 Servo crate:在 `webrender_api` 中找不到`Transaction`
- html - 如何将背景图片放在两个 div 前面?
- ios - Mac Catalyst 无法将图像保存在相册中,但不会产生错误
- sql - 具有默认值的 oracle sql 聚合函数
- php - 根据产品 ID 更改 WooCommerce 结帐订单备注占位符和标签
- python - 与 BeautifulSoup 中的 HTML 变量交互
- android - 我想将我的号码转换为飞镖中的文本