Django中如何为先定义的模型添加对后定义模型的关联关系
实现方案
你不需要在两个模型里都重复定义多对多关联,Django原生支持两种方式解决你的需求:
方案1:仅修改现有Movie模型的多对多字段(改动最小)
你已经在Movie中定义了characters多对多关联,只需要给这个字段加related_name参数,即可自定义Character侧的反向关联字段名:
class Character(models.Model): image = models.ImageField() name = models.CharField(max_length=100) age = models.IntegerField() story = models.CharField(max_length=500) def __str__(self): return self.name class Movie(models.Model): image = models.ImageField() title = models.CharField(max_length=100) creation_date = models.DateField(auto_now=True) rating = models.IntegerField() # 新增related_name参数,指定Character侧的反向关联名为movies characters = models.ManyToManyField(Character, related_name='movies') def __str__(self): return self.title
修改后使用方式:
- 拿电影关联的所有角色:
movie_instance.characters.all() - 拿角色出演的所有电影:
character_instance.movies.all()
方案2:将多对多字段定义在先声明的Character模型中
如果想把关联字段放在Character里,可以用带引号的模型名字符串声明关联,Django会延迟解析模型名,不受定义顺序限制:
class Character(models.Model): image = models.ImageField() name = models.CharField(max_length=100) age = models.IntegerField() story = models.CharField(max_length=500) # 用字符串'Movie'引用后定义的模型,指定related_name为Movie侧的关联名 movies = models.ManyToManyField('Movie', related_name='characters') def __str__(self): return self.name class Movie(models.Model): image = models.ImageField() title = models.CharField(max_length=100) creation_date = models.DateField(auto_now=True) rating = models.IntegerField() # 这里不需要再重复定义多对多字段 def __str__(self): return self.title
使用方式和方案1完全一致。
内容的提问来源于stack exchange,提问作者dazai
相关产品推荐
相关产品推荐

