Django之模型

Posted huiyichanmian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之模型相关的知识,希望对你有一定的参考价值。

一、Model类

  1.ORM思想

  ORM:Object Relationship Mapping 对象关系映射

  通过操作对象方法,来进行关系型数据库操作

  2.实现方式 

   在setting配置文件配置数据库    

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

 

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

 

?         创建好模型后,迁移(同步到数据库)

 

?        1.制作迁移计划

 

?       python manage.py makemigrations

 

  ?     2.执行计划任务

 

?       python manage.py migrate

二、操作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()方法可以显示对象中某个属性的值,以字典形式存储    

 

以上是关于Django之模型的主要内容,如果未能解决你的问题,请参考以下文章

django之模型层(待补充)

如何在Django视图中使用for循环返回每次迭代[关闭]

Django 04. django框架模型之生成数据表

django之 模型层

Django基础之MTV模型

Django学习系列之模型