美文网首页
Django-数据库操作之级联查询

Django-数据库操作之级联查询

作者: 测试探索 | 来源:发表于2022-09-04 10:28 被阅读0次

一、关联查询

由一到多的访问语法:

在子应用的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

相关文章

网友评论

      本文标题:Django-数据库操作之级联查询

      本文链接:https://www.haomeiwen.com/subject/detpnrtx.html