django学习手记(六)-----算法
原创模型
一、django
对各种数据库的良好支持,django为这些数据库提供统一调用。API,可以根据不同的业务需求选择不同的数据库。
2.配置数据库
(1)修改工程文件(project)下__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
(2)修改settings.py文件
DATABASES = {
default: {
ENGINE: django.db.backends.mysql,
NAME: sunck, #您的数据库名称
USER: root, #您的数据库用户名
PASSWORD: 123456, #您的数据库密码
HOST: , #数据库主机,默认为空。localhost
PORT: 3306, #您的数据库端口
OPTIONS: {
init_command: "SET sql_mode=traditional,default_storage_engine=INNODB;"#设置数据库INNODB,用于第三方数据库登录。
},
}
}
3.开发过程
(1)配置数据库
(2)定义模型
模型类对应于数据库中的数据表。
(3)生成移植文件
(4)执行迁移以生成数据表
(5)使用模型类进行添加、删除和修改
四、ORM
1、概念
对象-关系-映射
2、任务
(1)根据对象类型生成表结构
(2)转换对象list的操作,。sql语句
(3)将sql语句查询的结果将转换为对象、列表。
3、优点
它大大减少了开发人员的工作量,并且不需要面对面地更改数据库来修改代码。
4,插图(如下所示)

5.定义模型
1、模型、属性、表、字段之间的关系
模型对应于数据库中的表,模型类中定义的属性应该是模型比较表中的字段。
2,定义属性
(1)概述
1)django根据属性类型确定以下信息
- 当前选定的数据库支持字段类型。
- 呈现管理表单时使用html控件
- 管理现场的最低验证。
2)django自动增长主键列将添加到表中。每个模型只能有一个主键列。如果使用选项将属性设置为主键列,则django不再生成默认主键列。
3)特性命名限制
- 遵循标识符规则
- 由于django查询方法不允许使用连续下划线(两个都不允许)
(2)库
1)当定义属性时, 必填字段类型, 字段类型在中定义django.db. models.fields为了便于使用,将目录导入django.db.models中
2)用法
- 导入from django.db import models
- 通过models.Field创建字段类型的对象,并为该属性指定值。
(3)逻辑删除
对重要数据进行逻辑删除,而不进行物理删除。定义了实现方法isDelete
属性,类型为BooleanField,默认值为False
字段类型(字段选项)
(4)字段类型
1)models.AutoField()
- 一个根据实际情况ID自动增长IntegerField, 通常未指定
- 如果未指定,主键字段将自动添加到模型中。
2)CharField(max_ length=字符长度)
字符串,默认表单样式为。TextInput
3)models.TextField()
大文本字段,通常更多4000字节用法,默认窗体控件为Textarea
4)models.IntegerField()
整数
5)DecimalField(max_digits=None, decimal_places=None)
- 使用python的DecimalField实例表示的十进制浮点。3.1415926----->DecimalField(8,7)
- 参考说明
(1)DecimalField.max_digits位数总数
(2)DecimalField.decimal_places小数点后的位数
6)FloatField
用python的float实例以表示浮点数。
7)BooleanField(default=False默认否)或者(default=True默认是)
true/false字段,此字段的默认表单控件为CheckboxInput
8) NullBooleanField
支持null、true、 false三种值
9)DateField[auto_now=False, auto_now_ add=False ])
- 使用Python的datetime.date实例表示的日期
- 参数说明
(1)DateField.auto_now
每次保存对象时,字段会自动设置为当前时间
上次修改“
它始终使用默认的当前日期。false
(2)DateField.auto_now_add
当对象 首次创建时 自动设置当前时间,用于创建它始终使用默认的当前日期。false - 说明
默认情况下,与此字段对应的窗体控件为一个。TextInput。已将一个添加到管理员站点。JavaScript编写日历控件,然后选择一个。"Today"快捷按钮包含一个附加invalid_date错误消息密钥 - 注意
auto_now_add, auto_now, and default 这些设置是互斥的,它们之间的任何组合都会导致错误,只需编写一个即可。
10)TimeField
使用Python的datetime.time实例表示的时间,相同的参数。DateField
11)DateTimeField
使用Python的datetime .
datetime实例表示的日期和时间,具有相同的参数。DateField
12)FileField
上传文件的字段
13)ImageField
继承了FileField所有属性和方法,但请检查上载的对象以确保其有效。image(这是一张照片)
(5)字段选项
1)概述
字段选项启用对字段的约束。
字段对象时由关键字参数指定。
2)null
如果为True, Django 将空值以NULL 存储在数据库中,默认值为False
3)blanke
.如果为True, 该字段允许为空,默认值为False
4)注意
null是数据库类别的概念,blank 它是表格验证证书的类别
5)db_ column
字段的名称,如果未指定,则使用属性的名称。sage=models.IntegerField(db_column=“age”),数据库中age,此处或sage
6)db_ index
若值为True, 将为表中的此字段创建索引。
- default
默认值
8)primary_key
若为True,该字段成为模型的主键字段。
9)unique
若为True此字段在表中必须具有唯一值。
(6)关系
1)分类
- ForeignKey:一对多,在多个端点定义字段
- ManyToManyField; 多对多,在两端定义字段。
- OneToOneField: 一对一,在两端定义字段
2)使用一次访问获取更多
- 格式
对象.模型类小写_ set - 示例
grade . students_ set
3)一次访问一次
- 格式
对象.模型类小写 - 示例
grade.students
4)访问id
- 格式
对象.属性_id - 示例
student.sgrade_id
3,创建模型类
想要更改模型内容
(1)删除此数据库
(2)再次重建此数据库
(3)删除迁移文件(firstapp/migrations目录下0001_initial.py文件)
(4)执行迁移文件(project目录下的输入python manage.py makemigrations)
(5)再迁移(project目录下的输入python manage.py migrate)
添加类数据
mysql> select *from grades; >3;
+----+------------+----------------------------+------+----------+
| id | gname | gdate | gnum | isDelete |
+----+------------+----------------------------+------+----------+
| 1 | 计算机一级 | 2012-02-04 00:00:00.000000 | 30 | 0 |
| 2 | 计算机2级 | 2012-02-04 00:00:00.000000 | 30 | 0 |
| 3 | 财务管理 | 2012-02-04 00:00:00.000000 | 30 | 0 |
| 4 | 市场营销 | 2012-02-04 00:00:00.000000 | 30 | 0 |
+----+------------+----------------------------+------+----------+
添加学生数据
mysql> select *from students;
+----+--------+---------+------+------------+----------+-----------+
| id | sname | sgender | sage | scontend | isDelete | sgrade_id |
+----+--------+---------+------+------------+----------+-----------+
| 1 | 薛艳梅 | 0 | 20 | 我叫薛艳梅 | 0 | 1 |
| 2 | 向方 | 0 | 21 | 我叫向方 | 0 | 1 |
| 3 | 孔雨 | 1 | 21 | 我叫孔雨 | 0 | 2 |
| 4 | 孟林 | 1 | 20 | 我叫孟林 | 0 | 3 |
| 5 | 夏明 | 1 | 20 | 我叫夏明 | 0 | 2 |
| 6 | 孙艳 | 0 | 19 | 我叫孙艳 | 0 | 3 |
| 7 | 田宝 | 1 | 20 | 我叫田宝 | 0 | 4 |
+----+--------+---------+------+------------+----------+-----------+
4、元选项
在模型中定义一个。。Meta类,用于设置元信息。。
把之前的firstapp_grades改成grades,firstapp_students改成students
- db_table 定义数据表名称,建议使用小写字母,数据表示默认值
“项目名称小写_类名小写“(例如。db_table=“students”) -
ordering=[] 对象的默认排序字段,可能是对象列表。
ordering=[“id”] ------- 升序
ordering=[“-id”] ------- 降序
注意:排序会增加数据库的成本。在类的末尾添加以下两个代码,这将把前面的firstapp_grades改成grades
class Meta: db_table="grades"
在学生课堂结束时添加以下两个代码,这将放置上一个firstapp_students改成students
class Meta: db_table="students" ordering=["id"]
具体如下:

数据表名称显示在数据库中,如下图所示

6.模型成员
1、类属性
sname,sgender,sage,scontend等等是类属性。
(1)objects
- objects---->是Manager与数据库交互的类型的对象。
-
当定义模型类未指定管理器时,则。django创建名为的模型objects的管理器
from firstapp.models import Students stu=Students.objects.get(pk=1) stu <Students: 薛艳梅> stu.sage=22 stu.save()
mysql> select *from students; +----+--------+---------+------+------------+----------+-----------+ | id | sname | sgender | sage | scontend | isDelete | sgrade_id | +----+--------+---------+------+------------+----------+-----------+ | 1 | 薛艳梅 | 0 | 22 | 我叫薛艳梅 | 0 | 1 | | 2 | 向方 | 0 | 21 | 我叫向方 | 0 | 1 | | 3 | 孔雨 | 1 | 21 | 我叫孔雨 | 0 | 2 | | 4 | 孟林 | 1 | 20 | 我叫孟林 | 0 | 3 | | 5 | 夏明 | 1 | 20 | 我叫夏明 | 0 | 2 | | 6 | 孙艳 | 0 | 19 | 我叫孙艳 | 0 | 3 | | 7 | 田宝 | 1 | 20 | 我叫田宝 | 0 | 4 | +----+--------+---------+------+------------+----------+-----------+
(2)自定义模型管理器
当我们为模型指定当模型经理,django不再为模型类生成。objects模型管理器
class Grades(models.Model):
#自定义模型管理器
#当定制当模型经理,objects它不存在
stuObj=models.Manager()
>>> from firstapp.models import Students
>>> stu=Students.stuObj.get(pk=1)
>>> stu
>>> stu.sage=22
>>> stu.save()
(3)自定义模型管理器Manager类
- 当模型经理django模型与数据库交互,一个模型类可以有多个模型管理器。
-
作用
(1您可以向管理器类添加其他方法。
(2修改管理器返回的原始查询集。
重写get_queryset()方法,如过滤掉已被删除的学生,薛艳梅显示他们已被删除,isDelete为1stu=Students.objects.all() stu
以下统称为查询集,数据库全部输出,不进行筛选。
<QuerySet [<Students: 薛艳梅>, <Students: 向方>, <Students: 孔雨>, <Students: 孟林>, <Students: 夏明>, <Students: 孙艳>, <Students: 田宝>]>
class StudentsManager(models.Manager): def get_queryset(self): return super(StudentsManager,self).get_queryset().filter(isDelete=False) class Students(models.Model):
自定义模型管理器
#当定制当模型经理,objects它不存在 stuObj=models.Manager() stuObj2=StudentsManager()

#自定义模型管理器,objects它不存在
>>> stu=Students.objects.all()
Traceback (most recent call last):
File "", line 1, in
AttributeError: type object Students has no attribute objects
>>> stu=Students.stuObj.all()
>>> stu
#以下统称为查询集,数据库全部输出,不进行筛选。
, , , , , , ]>
>>> stu=Students.stuObj2.all()
>>> stu
#stuObj2被删除的学生被过滤掉,薛艳梅显示他们已被删除,isDelete为1
, , , , , ]>
2,创建对象
(1)目的:
将数据添加到数据库
(2)当创建对象时,django调用数据库时不读取或写入。save()仅与数据库交互,将对象保存在数据库表中。
(3)注意:
__ init__.py方法已在父类中。models.Model在自定义模型中不可用。
(4)方法
1)将类方法添加到模型类
#在学生类下定义以下类方法,注意使用@classmethod
#定义一个类方法来创建对象。,装饰符指示以下定义是一个类方法。
@classmethod
def createStudent(cls,name,gender,age,contend,grade,isD=False):
stu = cls(sname=name,sgender=gender,sage=age,scontend=contend,isDelete=isD,sgrade=grade)
return stu

在views.py在底部添加
from .models import Students,Grades
def addstudent(request):
grade=Grades.objects.get(pk=1)
stu =Students.createStudent("刘美美",0,34,"我叫刘美美",grade)
stu.save()
return HttpResponse(avnjka)
在firstapp.py/urls.py在在在在在文件下添加路径
path(addstudent/,views.addstudent)
输入网址http://localhost:8000/firstapp/addstudent/
获得下图,表明models.py数据添加成功

2)在自定义管理器中自定义一个方法,该方法应该是属性类中的自定义管理器。Manager类,您可以排除已删除的学生。
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager,self).get_queryset().filter(isDelete=False)
def createStudent(self,name,gender,age,contend,grade,isD=False):
stu=self.model()
stu.sname=name
stu.sgender=gender
stu.sage=age
stu.scontend=contend
stu.sgrade=grade
return stu

在views.py在底部添加
def addstudent2(request):
grade=Grades.objects.get(pk=1)
stu =Students.stuObj2.createStudent("刘梅",0,34,"我叫刘梅",grade)
stu.save()
return HttpResponse(********)
在firstapp.py/urls.py在在在在在文件下添加路径
path(addstudent2/,views.addstudent2)
在网页http://localhost:8000/firstapp/addstudent2/
获取下图以证明添加学生信息的成功

7.模型查询
1、概述
(1查询集表示从数据库获取的对象集合。
(2查询集可以有多个筛选器。
(3过滤器是根据给定参数限制查询集结果的函数。
(4)从sql透视、查询集和select语句等价,过滤器如下where条件
2、查询集
下面是返回所有查询集
return super(StudentsManager,self).get_queryset()
(1调用管理器上的filter方法返回查询集。
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager,self).get_queryset().filter(isDelete=False)
(2查询集在过滤后返回一个新的查询集,因此我们可以编写一个链式调用。
super(StudentsManager,self).get_queryset().filter(isDelete=False).filter()...#你也可以稍后再写。
(3)惰性执行-------在调用数据之前,创建查询集不会带来任何数据访问(也是为了提高性能)
(4)直接访问数据
- 迭代
- 序列化
- 与if合用
(5返回查询集的方法称为过滤器。(返回多条数据)
-
all()返回查询集中的所有数据。
-
filter(),返回符合条件的数据
(1)filter(键=值)
(2)filter(键=值,键=值) (两个键值对是和关系)
(3)filter(键=值).filter(键=值) -
exclude() 返回不符合条件的数据。
-
order_by() 排序
-
values() 一段数据就是一个对象。(字典),返回列表,
(6)返回单个数据
- get ()----- 返回满足条件的对象。
注意:(1如果未找到符合条件的对象,将引发模型类。.DoesNotExist”异常
(2如果找到多个对象,则会引发模型类。.MultipleObjectsReturned”异常
比如在views.py中studentsList=Students.stuObj2.get(sgender=True),性是男性的,很多对象 - count()-----返回当前查询集的数量Grades.objects.count()
- first()-----返回查询集中的第一个对象。
- last()------返回查询集中的最后一个对象。
- exists()----确定查询集中是否有数据,如果有数据,则返回。True
Grades.objects. exists()
(7)限制查询集–查询集返回一个可以使用下标方法限制的列表,该方法等价于sql中的limit语句,
studentsList=Students.stuObj2.all()[0:5]#取五行数据,在views.py中添加
注意:下标不能为负数
1、在firstapp/views.py在文件下,添加以下数据
from .models import Students,Grades
#分页显示学生
def stupage(request,page):
#0-3 3-6 6-9
#1 2 3
#page*3
page=int(page)
studentsList=Students.stuObj2.all()[(page-1)*3:page*3]
return render(request,firstapp/students.html,{"students":studentsList})

2、在firstapp/urls.py文件,添加以下代码。
path(stu/,views.stupage),

3,在中输入URL http://localhost:8000/firstapp/stu/1

4,在中输入URL http://localhost:8000/firstapp/stu/2

5,在中输入URL http://localhost:8000/firstapp/stu/3

(8查询集的缓存。
概述
- 每个查询集都包含一个缓存,以最小化对数据库的访问。
- 在新创建的查询集中,缓存第一次为空,并且第一次评估查询集(访问数据)时,发生数据缓存,django查询的数据将被缓存并返回查询结果。将来的查询将直接使用查询集进行缓存。
(9)字段查询–参数
1、概念
- 实现了sql中的where语句,作为一种方法filter(),exclude(),get()的参数
- 语法:属性名称__比较运算符=值(模型类中的相应属性)(比如:
sage__>=20年龄大于20的) - 外键:属性名称_id(如:
sgrade_id) - 转义:sql中的like用于语句%是匹配占位符,匹配数据。%(where like “%“)(模糊查询)
在过滤器中使用filter(sname__contains="%")
2,比较运算符
- (1)exact----判断,区分大小写,类似。filter(isDelete=False)
-
(2)contains----是否包括,区分大小写,filter(sname__contains=“刘”)
在firstapp/views.py在在在在文件下添加以下代码
from .models import Students,Grades def studentsearch(request):
显示的姓名包含刘子学生信息
studentsList=Students.stuObj2.filter(sname__contains="刘") return render(request,firstapp/students.html,{"students":studentsList})
在firstapp/urls.py在在在文件下添加
path(studentsearch/,views.studentsearch),
输入 http://localhost:8000/firstapp/studentsearch/ 网址,显示的姓名包含刘子学生信息

-
(3)startswith、endswith----以value开始或结束,区分大小写,filter(sname__startswith=“田”)
在firstapp/views.py文件下
from .models import Students,Grades def studentsearch2(request):
显示姓名中有田子学生信息
studentsList=Students.stuObj2.filter(sname__startswith="田") return render(request,firstapp/students.html,{"students":studentsList})
在firstapp/urls.py在在在文件下添加
path(studentsearch2/,views.studentsearch2),
输入 http://localhost:8000/firstapp/studentsearch2/ 网址,显示姓名中有田子学生信息

- (4)前面增加了以上四个i,这意味着它不区分大小写,iexact、icontains、istartswith、iendswith
- (5)isnull、isnotnull ----为空,filter(sname__isnull=False)
-
(6) in -----是否包含在范围内
在firstapp/views.py文件下
from .models import Students,Grades def studentsearch3(request):
获取pk在2,4,6内部学生信息
studentsList=Students.stuObj2.filter(pk__in=[2,4,6]) return render(request,firstapp/students.html,{"students":studentsList})
在firstapp/urls.py在在在文件下添加
path(studentsearch3/,views.studentsearch3),
输入 http://localhost:8000/firstapp/studentsearch3/

-
(7)gt----大于、gte----大于或等于,lt----小于、lte----小于等于
年龄大于20学生信息,仅替换了以下部分,其余部分相似。
studentsList=Students.stuObj2.filter(sage__gt=20)
-
(8)year、month、day、week_day、hour、minute、second
创建时间为2020类别信息
gradesList=Grades.objects.filter(gdate__year=2020)
-
(9)交叉关联查询
处理join查询----语法:模型类名__属性名__比较运算符def grades(request):
描述中带有“刘美美”字样的数据属于哪一类
gradesList=Grades.objects.filter(students__scontend__contains=刘美美) return render(request,firstapp/grades.html,{"grades":gradesList}) -
(10)查询快捷方式----pk----表示的主键
3,聚合函数
要使用哪个聚合函数需要引用
#在五种情况下,使用哪种参考
from django.db.models import Avg,Count,Max,Min,Sum
- 使用aggregate( )函数,返回聚合函数的值
- (1)Avg----平均值
- (2)Count----和
- (3)Max----
maxAge=Students.stuObj2.aggregate(Max(sage)) - (4)Min
- (5)Sum
4、F对象
- 您可以使用模型的A属性与B属性,如班级中男生的数量(A)以及女学生人数(B)比较
filter(ggirlnum__gt=F(gboynum)) - 支持F对象的算术运算。
filter(ggirlnum__gt=F(gboynum)+20)
需要引入F,Q
(1)
from django.db.models import F,Q
def grades1(request):
#看看女生比男生多的班级,你需要models.py在文件内部,在类下面,添加ggirlnum,gboynum这两个属性
g=Grades.objects.filter(ggirlnum__gt=F(gboynum))
print(g)
return HttpResponse("oooooo")
(2)
from django.db.models import F,Q
def grades1(request):
#视图(女孩数量)大于(男孩数量)+20班级,需要进来。models.py在文件内部,在类下面,添加ggirlnum,gboynum这两个属性
g=Grades.objects.filter(ggirlnum__gt=F(gboynum)+20)
print(g)
return HttpResponse("oooooo")
5、Q对象
- 概述:过滤器方法中的关键字参数是有条件的。And模式
- 需求:进行or查询
- 解决:使用Q对象
studentsList=Students.stuObj2.filter(Q(pk__lte=2))----只有一个Q用于匹配-
studentsList=Students.stuObj2.filter(~Q(pk__lte=2))----取反from django.db.models import F,Q def students(request):
pk<2或更老23 学生信息
studentsList=Students.stuObj2.filter(Q(pk__lte=2) | Q(sage__gt=23)) return render(request,firstapp/students.html,{"students":studentsList})
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123


