Django模型类关系
模型类关系
A表–>B表是一对一关系
1
2# 定义在A表或B中任意一个添加都可以, 后面跟随的是另一个关联的类名
b = models.OneToOneField('A', on_delete=models.CASCADE)A表–>B表是一对多的关系
1
2# 在B表中添加外键指向A表,后面跟随的是A表的类名
b = models.ForeignKey('A', on_delete=models.CASCADE)A–>B表是多对多的关系
1
2# 在A或B中任意一个添加都可以,后面跟随的是另一个关联的类名
b = models.ManyToManyField('A')自关联
1
2# 自关联指当前表的外键子段直接关联本表的主键,外键:hook
hook = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
关联查询
通过数据对象查询
1
2
3
4
5
6
7
8
9# B中的外键子段是hook
# 通过A中某一个主键值查询出B中所有与之关联的数据
a = A.objects.get(id=1)
# 此处的b必须为B类的小写
a.b_set.all()
# 通过B中的外键获取到与之关联的A中的对象
b = B.objects.get(id=1)
a = b.hook通过模型类对象进行查询
筛选条件的查询类中,如果有关系属性,则应该通过关系属性查询,反之应该通过类名(小写)查询
1
2
3
4
5
6# A-->B是一对多的关系,B类的外键为hook
# 通过B类的条件查询A类的数据:A类名.objects.filter(B类名小写__B类属性名__筛选条件)
A.objects.filter(b__id__gt=3)
# 通过A类的条件查询B类的数据:B类名.objects.filter(B类外键名__A类属性名__筛选条件)
B.objects.filter(hook__id__gt=3)
管理器
模型类.objects:管理器对象
django中创建一个模型类,都会给我们自动生成一个manager管理器对象(objects),一旦我们自定义管理器对象后,django就不会再为我们自动创建管理器对象了,他的主要作用如下:
改变查询的结果集
比如将all()方法的结果进行筛选
添加额外的方法
添加额外的方法帮助我们操作模型类对应的数据表
自定义模型管理器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# 自定义模型管理器需要继承models.Manager类
class BookManager(models.Manager):
# 修改返回集
def all(self):
data = super().all() # super, 直接调用父类的all方法
re_data = data.filter(id__gt=3)
return re_data
# 添加/修改方法
def add_data(self, hname, hskill, hhook):
# self.model()可以直接返回引用该方法的类对象
# name = self.model()
name = Hero()
name.hname = hname
name.skill = hskill
name.hhook = hhook
name.save()
return name
class Hero(models.Model):
hname = models.CharField(max_length=60)
hskill = models.CharField(max_length=20)
hhook = models.ForeignKey('Book', on_delete=models.CASCADE)
# 使用自定管理器
objects = BookManager()
元选项
解决问题
django中表的格式默认依赖于应用名称:【应用名称】.【类名小写】,如果应用名称发生了变化,则程序就会因为无法寻找到表格而发生错误,此时我们可以通过元选项指定模型类对应的表名
使用方式
1
2
3
4
5
6
7
8
9
10
11
12# 需要在模型类中定义一个元选项
class skill(models.Model):
hname = models.CharField(max_length=20)
Hero_type = models.OneToOneField('Book', on_delete=models.CASCADE)
# Meta、db_table:都是固定的,dbtable对应于表名
class Meta:
db_table = 'skill'
# 定义好以后需要重新生成模型类
python manage.py makemigrations
python manage.py migrate