一、关联查询
由一到多的访问语法:
在子应用的book/models.py文件中,系统会为我们自动添加一个 关联模型 类名小写_set
image.png
from django.db import models
# Create your models here.
"""
1.模型类 需要继承自models.Model
2.定义属性
id:系统默认生成
属性名 = models.类型(选项)
2.1 属性名对应的就是字段名
不要使用python,mysql关键字,不要使用连续的下划线(__ )
2.2 类型 MYSQL的类型
2.3 选项 是否有默认值,是否唯一,是否为null
charField 必须设置 max_length=10
verbose_name 主要是 admin站点使用
3.改变表的名称
默认表的名称:子应用名_类名 都是小写
修改表的名字
"""
class BookInfo(models.Model):
name = models.CharField(max_length=10,unique=True,verbose_name = '名字')
pub_data = models.DateField(null=True)
readcount = models.IntegerField(default=0)
commentcount = models.IntegerField(default=0)
is_delete = models.BooleanField(default=False)
# 1对多的关系模型中
# 系统会为我们自动添加一个 关联模型 类名小写_set
#peopleinfo_set = [PeopleInfo,PeopleInfo,...]
def __str__(self):
return self.name
class Meta:
db_table = 'bookinfo' #修改表的名字
verbose_name = '书籍管理' #admin站点使用
class PeopleInfo(models.Model):
# 定义一个有序字典
GENDER_CHOICE = (
(1,'male'),
(2,'female')
)
name = models.CharField(max_length=10,unique=True)
gender = models.SmallIntegerField(choices=GENDER_CHOICE,default=1)
description = models.CharField(max_length=100,null = True)
is_delete = models.BooleanField(default = False)
# 外键,系统会自动为外键添加_id,第一个参数外键的类名
# 外键的级联操作,主表和从表,主表的一条数据如果删除了,从表有关联的数据,
book = models.ForeignKey(BookInfo,on_delete = models.CASCADE)
class Meta:
db_table = 'peopleinfo'
def __str__(self):
return self.name
在book/views.py文件中,进行级联操作查询
查询书籍为1的所有人物信息
book = BookInfo.objects.get(id = 1)
book.peopleinfo_set.all()
image.png
由多到一的访问语法:
查询人物为1的书籍信息
from book.models import BookInfo,PeopleInfo
person = PeopleInfo.objects.get(id = 1)
person.book.name
image.png
二、关联过滤查询
一对多的操作
语法形式,查询1的数据,条件为n
模型类名.objects.(关联模型类名小写__字段名__运算符= 值)
查询图书,要求图书人物为"郭靖"
BookInfo.objects.filter(peopleinfo__name__exact = '郭靖')
image.png
查询图书,要求图书中人物的描述包含'八'
BookInfo.objects.filter(peopleinfo__description__contains = '八')
image.png
多对一的操作
语法形式
模型类名.objects.(关联模型类名外键__字段名__运算符= 值)
查询书名为"天龙八部"的所有人物
# book为PeopleInfo的外键
PeopleInfo.objects.filter(book__readcount__gt = 30)
运行结果
image.png
网友评论