美文网首页
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