django学习手记(六)-----算法

原创
小哥 3年前 (2022-11-16) 阅读数 16 #大杂烩

模型

一、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, 将为表中的此字段创建索引。

  1. 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为1

    stu=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})
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

上一篇:JavaScript学(第一天) 下一篇:html学一