模型类关系
关系字段类型
关系型数据库的关系包括三种类型:
- 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管理器。
一个模型类就对应一个模型管理器类。
- 自定义一个管理器类,这个类继承models.Manger类。
- 再在具体的模型类里定义一个自定义管理器类的对象。
自定义管理器类的应用场景:
1.改变查询的结果集。
比如调用BookInfo.books.all()返回的是没有删除的图书的数据。
2.添加额外的方法,操作管理器对象所在的模型类对应的数据表。
管理器类中定义一个方法帮我们创建对应的模型类对象。
使用self.model()就可以创建一个跟自定义管理器对应的模型类对象。
元选项
Django默认生成的表名:
应用名小写_模型类名小写。
元选项:
需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。