Django框架(10)_模型 :模型类关系、关联查询、插入和删除、自关联、管理器、元选项

模型类关系

关系字段类型

关系型数据库的关系包括三种类型:

  • ForeignKey:一对多,将字段定义在多的类一端中
  • ManyToManyField:多对多,将字段定义在任意一端中
  • OneToOneField:一对一,将字段定义在任意一端中

一对多关系

例:图书类-英雄类

models.ForeignKey() 定义在多的类中

# 定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)  # 图书名称
    

# 定义英雄模型类HeroInfo
class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)  # 英雄姓名
    hcomment = models.CharField(max_length=200)  # 英雄描述信息
    hbook = models.ForeignKey('BookInfo')  # 英雄与图书表的关系为一对多,所以属性定义在英雄模型类中

多对多关系

例:新闻类-新闻类型类

models.ManyToManyField() 定义在哪个类中都可以

class TypeInfo(models.Model):
    tname = models.CharField(max_length=20)  # 新闻类别


class NewsInfo(models.Model):
    ntitle = models.CharField(max_length=60)  # 新闻标题
    ncontent = models.TextField()  # 新闻内容
    npub_date = models.DateTimeField(auto_now_add=True)  # 新闻发布时间
    ntype = models.ManyToManyField('TypeInfo')  # 通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系

一对一关系

例:员工基本信息类-员工详细信息类

models.OneToOneField定义在哪个类中都可以

class EmployeeBasicInfo(models.Model):
    """员工基本信息类"""
    name = models.CharField(max_length=20)  # 姓名
    gender = models.BooleanField()  # 性别
    age = models.IntegerField()  # 年龄
    
    
class EmployeeDetailInfo(models.Model):
    """员工详细信息"""
    addr = models.CharField(max_length=256)  # 地址
    """教育信息、工作经历、、、"""
    employee_basic = models.OneToOneField('EmployeeBasicInfo')  # 关系属性


关联查询

在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。

例:查询id为1的图书关联的所有英雄的信息

book = BookInfo.objects.get(id=1)

book.heroinfo_set.all()

通过模型类查询

HeroInfo.objects.filter(hbook__id=1)

例:查询id为1的英雄所属图书信息。

hero =HeroInfo.objects.get(id=1)

hero.hbook.id

hero.hbook_id

通过模型类查询

BookInfo.objects.filter(heroinfo__id=1)

格式:

由一类的对象查询多类的时候:一类的对象.多类名小写_set.all() #查询所用数据

由多类的对象查询一类的时候:多类的对象.关联属性  #查询多类的对象对应的一类的对象

由多类的对象查询一类对象的id时候:多类的对象. 关联属性_id

通过模型类实现关联查询

要拿到哪个表里的数据,就通过哪个模型类名来查

例:查询图书信息,要求图书中英雄的描述包含'八'。

BookInfo.objects.filter(heroinfo__hcomment__contains=’八’)

例:查询图书信息,要求图书中的英雄的id大于3.

BookInfo.objects.filter(heroinfo__id__gt=3)

例:查询书名为“天龙八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle=’天龙八部’)

通过多类的条件查询一类的数据

一类名.objects.filter(多类名小写__多类属性名__条件名)

通过一类的条件查询多类的数据

多类名.objects.filter(关联属性__一类属性名__条件名)


插入、更新和删除

调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新

调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除


自关联

 自关联是一种特殊的一对多的关系。


管理器

BookInfo.objects.all()->objects是一个什么东西呢?

答:objects是Django帮我自动生成的模型类管理器对象,通过这个管理器可以实现对数据的查询。

objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。

一个模型类就对应一个模型管理器类。

  1. 自定义一个管理器类,这个类继承models.Manger类。
  2. 再在具体的模型类里定义一个自定义管理器类的对象。

自定义管理器类的应用场景:

1.改变查询的结果集。

比如调用BookInfo.books.all()返回的是没有删除的图书的数据。

2.添加额外的方法,操作管理器对象所在的模型类对应的数据表。

管理器类中定义一个方法帮我们创建对应的模型类对象。

使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。


元选项

Django默认生成的表名:

应用名小写_模型类名小写。

元选项:

需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轨迹|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值