这里写目录标题
7.1 多对一关系
from django.db import models
# Create your models here.
# 书籍模型类
# 会自动生成id
# 书名、发布日期、阅读量、评论量、售空
class BookInfo(models.Model):
# 书名 字符串类型 max_length=20最大长度为20
name = models.CharField(max_length=20, verbose_name='书名')
# 发布日期 日期类型 null=True允许为空
pub_date = models.DateField(null=True, verbose_name='发布日期')
# 阅读量 整形 default=0默认为0
read_count = models.IntegerField(default=0, verbose_name='阅读量')
# 评论量 整形 default=0默认为0
comment_count = models.IntegerField(default=0, verbose_name='评论量')
# 售空 布尔类型 default=False默认为假
sale_out = models.BooleanField(default=False, verbose_name='售空')
# 元类
class Meta:
verbose_name = '书籍信息表' # admin页面中表的名字
# 与`verbose_name`功能相同,但是不会自动在字符串后加"`s`"以表复数
# 设置表的复数名称
verbose_name_plural = verbose_name # admin页面中表的名字(复数)
db_table = 'bookinfo' # 在数据库中的表名
def __str__(self): # 直接输出对象是,输出对象的名字
return self.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(to=BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
# to:后边写所关联的模型类
# on_delete=models.CASCADE:主表中数据删除,从表也删除
# 外键关联的是整个模型类,不是单独的某一个对象
# 但是通过模型类会产生一个相关联的字段 字段名_id
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'peopleinfo'
verbose_name_plural = db_table
verbose_name = '人物信息'
def __str__(self):
return self.name
练习
# 级联查询练习:
from books.models import BookInfo,PeopleInfo
# 查询书籍为1的所有人物信息
# 方法1
book = BookInfo.objects.get(id=1)
book.peopleinfo_set.all()
# 方法2
PeopleInfo.objects.filter(book__id=1)
# 查询人物为1的书籍信息
# 方法1
people = PeopleInfo.objects.get(id=1)
people.book
# 方法2
BookInfo.objects.filter(peopleinfo__id=1)
# 查询图书,要求图书人物为"郭靖"
BookInfo.objects.filter(peopleinfo__name='郭靖')
# 查询图书,要求图书中人物的描述包含"八"
BookInfo.objects.filter(peopleinfo__description__contains='八') # description 描述
# 查询书名为“天龙八部”的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')
# 查询图书阅读量大于30的所有人物
PeopleInfo.objects.filter(book__read_count__gt=30)