第七单元 ORM表关系及操作

1.多对一关系

django使用django.db.models.ForeignKey定义多对一关系
.ForeignKey需要一个参数:就是外键连接

class PeopleInfo(models.Model):
 book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')

在这里插入图片描述


# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'
        verbose_name_plural=verbose_name

    def __str__(self):
        return self.name

1.1.2 多对一关系的蹭删改操作

添加书籍:
BookInfo.objects.create(
    name="python",
    pub_date="2002-02-27",
    read_count=200,
    comment_count=100,
)

删除书籍:
BookInfo.objects.filter(name="python").delete()

修改书籍:
BookInfo.objects.filter(name="python").update(sale_out=True)

2.一对一关系

模型类使用OneToOneField用来定义一对一关系;

2.1.2一对一关系增删改查操作

>>> t1 = Teacher.objects.create(name='Jack',age='22')
>>> t2 = Teacher.objects.create(name='Bob',age='17')
>>> p1 = Professor.objects.create(teacher=t1,big_project='雾霾净化术')
>>> p1.teacher
<Teacher: Jack>
>>> p1.teacher = t2
>>> p1.save()

2.1.3一对一关系正向查询

# 正向查询:通过教授,查询对应的讲师信息
>>> p1.teacher
<Teacher: Bob>

2.1.4一对一关系反向查询

# 反向查询:通过讲师,查询教授信息, 反向查询时,只需要 模型类 本身即可
t1.professor.name

3.多对多关系

多对多关系在模型中使用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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值