第七单元 ORM表关系及操作

本文介绍了Django框架中模型的定义与数据库表的关联,包括书籍和人物信息的模型类。通过示例展示了多对一关系的实现,如外键的使用,并给出了级联查询的多种方法,如查询特定书籍的人物信息或人物关联的书籍信息。此外,还演示了如何根据人物名称、描述内容等进行复杂查询。
摘要由CSDN通过智能技术生成

这里写目录标题

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值