Django之模型

1、Model类

  1.ORM思想python

  ORM:Object Relationship Mapping 对象关系映射mysql

  经过操做对象方法,来进行关系型数据库操做sql

  2.实现方式 

   在setting配置文件配置数据库    shell

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'HOST': 'localhost',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456',
    }
}

 

 

​     继承Model类(django.db.models.Model) 数据库

from django.db import models

# Create your models here.

class Student(models.Model):
    name = models.CharField(max_length=20)
    sex = models.CharField(max_length=10)
    score = models.FloatField()

    class Meta:  #定义表结构的信息
        db_table = 'students'

 

    模型类对应于数据库表,类属性 对应于表字段django

 

​         建立好模型后,迁移(同步到数据库)缓存

 

​        1.制做迁移计划并发

 

​       python manage.py makemigrationsapp

 

  ​     2.执行计划任务函数

 

​       python manage.py migrate

2、操做Model

  1.概述

   咱们能够在shell中操做相关语句,也能够视图函数中使用相关语句

    【如下操做都是在shell环境中执行】

   进入shell 环境

    python manage.py shell

  2.添加数据

   2.1经过模型类的对象管理器插入记录

   语法:模型类名.objects.create(类属性=值) 

      【此方法是直接操做数据库】  

# 导入Student包
from myapp.models import Student
stu1 = Student.objects.create(name='aaa',sex='m',score=95.
0)

 

   2.2 实例化模型对象插入记录

  【注意:经过对象模型进行 插入操做是在内存中执行的,须要经过save函数加载到数据库中】

stu3 = Student(name='a',sex='m',score=89)
stu3.save()

 

   3.添加记录

    3.1经过模型类的对象管理器插入记录

    语法:模型类名.objects.create(类属性=值)

    【此方法是直接操做数据库】

# 导入Student包
from myapp.models import Student
stu1 = Student.objects.create(name='aaa',sex='m',score=95.
0)

 

     3.2实例化模型对象插入记录

stu3 = Student(name='a',sex='m',score=89)
stu3.save()

 

    【注意:经过对象模型进行插入操做是在内存中执行的,须要经过save函数加载到数据库中】

   3.3修改删除操做

    修改:经过对象.属性=新属性值更改,而后save()进行提交

    删除:对象.delete(),删除对象

stu = Student.objects.get(id=1)
stu.score = 100
stu.save()


stu.delete()

 

  4.查询操做

    4.1简单查询

    查询惟一的记录

    模型名.objects.get(查询条件) 

1.查询主键为1的记录
 stu = Student.objects.get(id=1)
    
get()返回一条记录【即查询条件为惟一值且必须存在,通常查询主键】,以模型对象表示 

 

     查询全部记录

     模型类名.object.all()

查询全部:
 students1 = Student.objects.all()

返回Django的QuerySet对象,能够被遍历

    4.2过滤查询

     模型类名.objects.filter(查询条件)

s1 = Students.objects.filter(sex='m')
返回Django中的QuerySet容器,能够被遍历

多条件查询,查询条件使用,隔开表示逻辑与
s1 = Student.objects.filter(sex='m',name='aaa')

 

    4.3排除查询

     模型类名.objects.exclude(查询条件)

     exclude是把查询条件以外的内容显示出来

查询分数小于85的学生记录
students = Student.objects.exclude(score__gte=85)

 

    4.4 使用魔法参数查询

字段后面跟双下划线"__",表示特殊查询
经常使用的双下划线魔法参数有:
 __year     __month   __day   __startswith  __endswith  
__gte 大于等于
__lte 小于等于
__contains (至关于模糊查询)
    

s1 = Student.objects.filter(name__startswith='a')    
    

 

    4.5 限制查询【切片】

s1 = Student.objects.all()[1:3]

查询前三个
s1 = Student.objects.all()[:3]

查询奇数条记录
s1 = Student.objects.all()[::2]

    4.6排序查询

    模型类名.objects.order_by("排序字段名")

降序
s1 = Student.objects.order_by('-score')


升序
s1 = Student.objects.order_by('score')


查询成绩前三名

s1 = Student.objects.order_by('-score')[:3]

 

   4.7原生sql查询

    模型类名.objects.raw('原生sql')

# 模糊查询
使用原生sql查询名字中包含a的记录
s1 = Student.objects.raw('select * from students where nam
e like "%%a%%"')

至关于select * from students where name like "%a%"

# 使用占位符
查询名字为张三,性别为男的学生信息,使用原生sql语句

s1 = Student.objects.raw('select * from students where nam
e="%s" and sex="%s"'%('张三',''))


a='张三'
b=''
 s1 = Student.objects.raw('select * from students where na
me="{a}" and sex="{b}"')


s1 = Student.objects.raw('select * from students where nam
e=%s and sex=%s',['张三',''])

 

    4.8Q查询

    对于复杂组合查询条件,使用Q查询很方便

    经过实例化Q对象,将Q对象传递到filter()、get()方法中能够组合出多种查询条件

    Q查询依赖于Q对象(from django.db.models import Q)

    Q对象之间可使用&、|。在Q对象前加~表示Q封装条件的否认条件

查询男生中90分以上的学生记录
from django.db.models import Q
q1 = Q(sex='')
q2 = Q(score__gte=90)
 s1 = Student.objects.filter(q1&q2)

& :逻辑与
|   :逻辑或
~ :逻辑非

 

    4.9 F查询

    F()对象生成一个SQL表达式,来描述数据库层级所须要的操做,与更新操做相关

描述数据库层级的操做,而不是内存层级的操做
即,能够直接操做数据库中的数据,而不是先更改缓存,再上传数据库

解决并发性问题

使用F对象更新学生成绩,将1号学生成绩在原有基础上+5分

from django.db.models import F
s1 = Student.objects.get(id=1)
s1.score = F('score')+5
s1.save()

    4.10 聚合查询

    aggregate(*args,**kwargs)

    可能要导入的:from django.db.models import Min,Avg,Max,Sum,Count

查询全部学生的平均成绩
from django.db.models import Avg,Max,Min,Count,Sum

avg = Student.objects.aggregate(Avg('score'))

avg = Student.objects.all().aggregate(as=Avg('score'))

as 是avg对象的别名

查询结果是一个字典 

     4.11分组查询

      annotate(*args,**kwargs)

根据性别查询不一样性别的平均值
 s1 = Student.objects.values('sex').annotate(Avg('score'))

    
.values()方法能够显示对象中某个属性的值,以字典形式存储    
相关文章
相关标签/搜索