提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
-
多对一(最常用)
-
多对多
- 总结
多对一(最常用)
相当于mysql中的外键
外键的作用:外键是一种约束,不是让2张表产生关系的,可以限制外键字段更新和插入
定义模型类
Cate:cate_name 分类名
Movies:电影名 票价 所属分类
多对一的添加:
一种是根据外键字段进行添加 外键字段 = 对象
一种是根据外键_id进行添加 外键字段_id = id
查询:
由多查一(通过点影查分类):
由一查多(通过分类查询点影):
多对多
一个音乐家可以隶属很多个乐队
一个乐队也可以有很多个音乐家
class Artist(models.Model):
artist_name = models.CharField(max_length=30,verbose_name="音乐家名字")
# 定义元类
class Meta:
db_table = "artist"
def __str__(self): # 返回对象的描述信息
return self.artist_name
# 定义乐队模型类
class Band(models.Model):
band_name = models.CharField(max_length=30,verbose_name="乐队名")
# 多对多就不需要写on_delete:因为本身2张表之间没有任何关系,是第三张表专门存储关系
artist = models.ManyToManyField(Artist)
# 定义元类
class Meta:
db_table = "band"
def __str__(self): # 返回对象的描述信息
return self.band_name
1.添加音乐家 模型类.objects.create()
a1 = Artist.objects.create(artist_name="爱德华")
a2 = Artist.objects.create(artist_name="刘德华")
2.在添加乐队
b1 = Band.objects.create(band_name="摇滚天团")
b2 = Band.objects.create(band_name="爱德华天团")
3.将音乐家添加到乐队里
--b1这个乐队有2个音乐家 分别是 爱德华(a1) 刘德华(a2)
b1.artist.add(a1,a2)
--b2这个乐队只有一个音乐家就是爱德华
b2.artist.add(a1)
正向查询:
查看一下b1乐队的成员
b1.artist.all()
查看一下b2乐队的成员
b2.artist.all()
反向查询:
查询a1加入的乐队
a1.band_set().all()
解除a2和b1乐队的关系 remove
在b1乐队中解除a2这个音乐家
b1.artist.remove(a2) # 只是解除音乐家和乐队之间的关系,并不是删除数据
总结
不管是多对一还是多对多
都需要注意查询,尤其是反向查询_set()