Django框架(七):Django模型系统 ② 常用查询及表关

2019-04-05  本文已影响0人  加州旅馆_6741

1.常用查询

每一个Django模型类,都有一个默认的管理器objects
QuerySet表示数据库中对象的列表,他可以有0到多个过滤器,过滤器通过给定的参数缩小查询范围。
QuerySet等同于select语句,过滤器是一个限制字句,比如where,比如limit。

In [1]: from teacher.models import Students   
In [2]: Students.objects.all()
Out[2]: <QuerySet [<Students: 小米>, <Students: 小明>, <Students: 小李>]>  ##返回的是QuerySet
In [3]: Students.objects.first() 
Out[3]: <Students: 小米>    #返回的是对象
In [4]: Students.objects.last()
Out[4]: <Students: 小李>
In [5]: Students.objects.get(pk=1)
Out[5]: <Students: 小米>
In [17]: Students.objects.filter(name='小明').first()                                      
Out[17]: <Students: 小明>
In [19]: Students.objects.exclude(pk=1)                                              
Out[19]: <QuerySet [<Students: 小明>, <Students: 小李>]>

排序

In [20]: Students.objects.all().order_by('name')     #根据name字段正序排序                                     
Out[20]: <QuerySet [<Students: 小明>, <Students: 小李>, <Students: 小米>]>
In [21]: Students.objects.all().order_by('name','-age')      #根据age反序排序             
Out[21]: <QuerySet [<Students: 小明>, <Students: 小李>, <Students: 小米>]>
In [24]: Students.objects.all().order_by('name')[::-1]                                         
Out[24]: [<Students: 小米>, <Students: 小李>, <Students: 小明>]

限制字段查询

In [25]: Students.objects.values('name')                                                       
Out[25]: <QuerySet [{'name': '小米'}, {'name': '小明'}, {'name': '小李'}]>

In [26]: print(Students.objects.values('name').query)                                                              
SELECT `teacher_students`.`name` FROM `teacher_students`
In [27]: Students.objects.only('name')                                                           
Out[27]: <QuerySet [<Students: 小米>, <Students: 小明>, <Students: 小李>]>

多条件OR连接

需要使用or条件,我吗要使用到Q对象

In [28]: from django.db.models import Q    #导入Q模块

In [29]: Students.objects.filter(Q(name='小米')|Q(name='小明'))                  
Out[29]: <QuerySet [<Students: 小米>, <Students: 小明>]>

查询条件

相当于是SQL语句中的where语句后面的条件,语法为字段名__规则

In [30]: Students.objects.filter(name__exact='小米')    # 等同于namet='小米'     
Out[30]: <QuerySet [<Students: 小米>]>

聚合函数

In [31]: Students.objects.all().count()                                                     
Out[31]: 3
In [32]: from django.db.models import Avg #导入模块
In [34]: Students.objects.aggregate(age_avg=Avg('age'))                                                                 
Out[34]: {'age_avg': 15.0}
分组聚合

分组需要结合values,annotate和聚合 ,方法 看下面的案例
查询男生女生多少人:

In [35]: from django.db.models import Count  

In [37]: Students.objects.values('sex').annotate(Count('sex'))        
Out[37]: <QuerySet [{'sex': 1, 'sex__count': 3}]>

关于聚合查询的详细介绍 ==》https://blog.csdn.net/weixin_42134789/article/details/84567365

2.常用模型字段类型

3.常用模型字段参数

4.表关系实现

Django中,模型通过特殊的字段进行关系连接

from django.db import models

# Create your models here.

class Students (models.Model): # 一个类代表一个数据表
    id = models.AutoField(primary_key=True) ##创建一个可以自动生成的主键,这条也可以不写,Django中会自动生成主键
    name = models.CharField(verbose_name='姓名',max_length=20)   ##创建字符类型字段,最大长度为20,设置提示信息'姓名'
                                            ### max_length为CharField的必须参数
    age = models.SmallIntegerField(verbose_name='年龄',null=True) ##创建值可以为null的小整型字段,
    sex = models.SmallIntegerField(default=1)   ##创建缺省值为1的小整型字段
    qq = models.CharField(max_length=20,null=True)
    phone = models.CharField(max_length=20,null=True)
    c_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)  ##创建日期时间类型字段,自动创建当前时间

    def __str__(self):
        return self.name

class StudentsDetail(models.Model):  #学生详情表
    student = models.OneToOneField('Students',on_delete=models.CASCADE) #一对一关联,关联Students类,on_delete代表级联,关联的Students表删除后自动删除此表
    card_num = models.CharField(verbose_name='身份证号码',max_length=20,unique=True,null=True)
    college = models.CharField('毕业院校',max_length=20,default='家里蹲')
from django.db import models

# Create your models here.

class Students (models.Model): # 一个类代表一个数据表
    id = models.AutoField(primary_key=True) ##创建一个可以自动生成的主键,这条也可以不写,Django中会自动生成主键
    name = models.CharField(verbose_name='姓名',max_length=20)   ##创建字符类型字段,最大长度为20,设置提示信息'姓名'
                                            ### max_length为CharField的必须参数
    age = models.SmallIntegerField(verbose_name='年龄',null=True) ##创建值可以为null的小整型字段,
    sex = models.SmallIntegerField(default=1)   ##创建缺省值为1的小整型字段
    qq = models.CharField(max_length=20,null=True)
    phone = models.CharField(max_length=20,null=True)
    c_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)  ##创建日期时间类型字段,自动创建当前时间
    grade = models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True) #一对多关联,外键关联Grade班级表,models.SET_NULL设置班级表删除后,此字段自动为NULL

    def __str__(self):
        return self.name

class StudentsDetail(models.Model):
    student = models.OneToOneField('Students',on_delete=models.CASCADE) #一对一关联,关联Students类,on_delete代表级联,关联的Students表删除后自动删除此表
    card_num = models.CharField(verbose_name='身份证号码',max_length=20,unique=True,null=True)
    college = models.CharField('毕业院校',max_length=20,default='家里蹲')

class Grade(models.Model):
    name = models.CharField('班级名称',max_length=20,)
    num = models.CharField('班期',max_length=20)
from django.db import models

# Create your models here.

class Students (models.Model): # 一个类代表一个数据表
    id = models.AutoField(primary_key=True) ##创建一个可以自动生成的主键,这条也可以不写,Django中会自动生成主键
    name = models.CharField(verbose_name='姓名',max_length=20)   ##创建字符类型字段,最大长度为20,设置提示信息'姓名'
                                            ### max_length为CharField的必须参数
    age = models.SmallIntegerField(verbose_name='年龄',null=True) ##创建值可以为null的小整型字段,
    sex = models.SmallIntegerField(default=1)   ##创建缺省值为1的小整型字段
    qq = models.CharField(max_length=20,null=True)
    phone = models.CharField(max_length=20,null=True)
    c_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)  ##创建日期时间类型字段,自动创建当前时间
    grade = models.ForeignKey('Grade',on_delete=models.SET_NULL,null=True) #一对多关联,外键关联Grade班级表,models.SET_NULL设置班级表删除后,此字段自动为NULL

    def __str__(self):
        return self.name

class StudentsDetail(models.Model):
    student = models.OneToOneField('Students',on_delete=models.CASCADE) #一对一关联,关联Students类,on_delete代表级联,关联的Students表删除后自动删除此表
    card_num = models.CharField(verbose_name='身份证号码',max_length=20,unique=True,null=True)
    college = models.CharField('毕业院校',max_length=20,default='家里蹲')

class Grade(models.Model):
    name = models.CharField('班级名称',max_length=20,)
    num = models.CharField('班期',max_length=20)

class Course(models.Model):
    name = models.CharField('课程名称',max_length=20)
    #student = models.ManyToManyField('Students') #多对多关联,默认会创建一张中间表,当你需要中间表中添加额外字段,最好指定一张中间表
    student = models.ManyToManyField('Students',through='Enroll') #多对多关联,指定Enroll表为中间表

class Enroll(models.Model):  #多对多的中间表,等于一张报名表
    student = models.ForeignKey('Students',on_delete=models.CASCADE) #外键关联学生表
    course = models.ForeignKey('Course',on_delete=models.CASCADE) #外键关联课程表
    c_time = models.DateTimeField(auto_now_add=True)
    paid = models.FloatField('付款',default=0)
上一篇 下一篇

猜你喜欢

热点阅读