如何在Django的Movie类中存储多个ActorsAndDirectors对象?
问题解决:Django中实现Movie关联多个ActorsAndDirectors对象
当前你的Movie模型中cast字段使用ForeignKey,这是一对多关联关系,意味着一部电影只能关联一个演员/导演对象,所以API面板里只能插入一个。要实现多对象存储,你需要改用多对多关联字段ManyToManyField。
修改步骤:
- 更新模型字段
将Movie类中的cast字段替换为ManyToManyField,代码如下:
class ActorsAndDirectors(models.Model): name = models.CharField(max_length=32, blank=False, null=False) surname = models.CharField(max_length=32, blank=False, null=False) role = models.CharField(max_length=11, blank=False, null=False) def __str__(self): return f"{self.name} {self.surname}" class Movie(models.Model): title = models.CharField(max_length=50, blank=False, null=False, unique=True) description = models.TextField(max_length=400) # 替换ForeignKey为ManyToManyField,无需on_delete参数 cast = models.ManyToManyField(ActorsAndDirectors) premiere = models.DateField() updated = models.DateTimeField() slug = models.SlugField() def number_of_ratings(self): return Rating.objects.filter(movie=self).count() def avg_rating(self): score = 0 ratings = Rating.objects.filter(movie=self) for rating in ratings: score +=rating.stars if len(ratings) > 0: return score/len(ratings) else: return 0 def __str__(self): return f"{self.title}, ({self.premiere})"
- 执行数据库迁移
修改模型后,需要更新数据库结构:python manage.py makemigrations python manage.py migrate
效果说明:
修改完成后,在API面板(无论是Django Admin还是DRF的可视化界面)中,cast字段会变成可多选的控件,允许你为一部电影关联多个ActorsAndDirectors对象。
Django的ManyToManyField会自动创建中间表来维护电影与演员/导演的多对多关系,无需手动创建中间模型(如果不需要额外字段的话)。如果后续需要在关联中添加额外信息(比如演员的具体参演角色),可以自定义中间模型并通过through参数指定。
内容的提问来源于stack exchange,提问作者woodbine
相关产品推荐
相关产品推荐

