多对多关系

什么是多对多关系

多对多关系在模型中使用ManyToManyField字段定义

多对多关系可以是具有关联,也可以是没有关联,所以不需要明确指定on_delete属性

生活中,多对多关系:一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队一个文章中可以有很多标签,一个标签也可出现在很多文章中在多对多关系中专门有第三张表来存储对应关系,表本身之间没有任何关联,此时删除和修改数据不影响另外一张表from

django.db import models
# 一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队
# 定义音乐家模型类
class Artist(models.Model):    
    artist_name = models.CharField(max_length=20,verbose_name="音乐家名字")
    #     定义元类    
    class Meta:        
        db_table = "artist1"    
    def __str__(self):        
        return self.artist_name
    # 定义乐队模型类
    class Band(models.Model):    
        band_name = models.CharField(max_length=20,verbose_name="乐队名")    
        # 多对多    
        artist = models.ManyToManyField(Artist)    
        # 定义元类    
        class Meta:        
            db_table = "band"    
        def __str__(self):        
            return self.band_name

多对多关系为什么不需要on_delete属性

# 在多对多的情况,有专门的第三张表,存储 对应关系, 表本身并没有字段来存储对应关系,此时删除任意数据,不影响另一张表数据

多对多关系的外键添加操作

创建音乐家以及乐队

添加音乐家语法:
    模型类.objects.create()
    a1 = Artist.objects.create(artist_name="朗朗")
    a2 = Artist.objects.create(artist_name="李健")
添加乐队语法:
    语法:
    b1 = Band.objects.create(band_name="破吉他乐队")
    b2 = Band.objects.create(band_name="凯乐乐队")

创建出两个乐队之后对其进行音乐家的添加 多对多字段添加时,可以使用add函数进行多值增加

# b1这个乐队有2个音乐家分别是a1和a2  将a1和a2添加到b1这个乐队里
b1.artist.add(a1,a2)
# b2这个乐队有一个音乐家是a2
b2.artist.add(a2)

多对多关系的外键移除操作

多对多关联字段的删除,要使用remove来进行关系的断开 而不是直接使用deleteremove只会断开数据之间的联系,但是不会将数据删除

在B1乐队中删除A1乐家

多对多关联字段的删除,要使用`remove`来进行关系的断开
而不是直接使用`delete`,`remove`只会断开数据之间的联系,但是不会将数据删除

在B1乐队中删除A1乐家

多对多关系的修改和查询

# 通过外键查询该乐队的全部音乐家
# 查看b1乐队的成员
b1.artist.all()
# 查看b2乐队的成员
b2.artist.all()

# 反向查询:通过音乐家,查询该音乐家加入的乐队信息
# 查看a2这个音乐家所属的乐队
a2.band_set.all()

 

posted @ 2022-06-27 17:02  一人担  阅读(340)  评论(0)    收藏  举报