Django——ORM

一、模板

'parentloop': 外层循环
'counter0': 当前循环获得数据的索引,索引是从0开始计算
'counter': 当前循环获得数据的索引,索引是从1开始计算 
'revcounter': 当前反向循环获得数据的索引, 索引是从1开始计算 
'revcounter0': 当前反向循环获得数据的索引, 索引是从0开始计算 
'first': 表示当前循环是否为循环的第一次循环
'last': 表示当前循环是否为循环的最后一次循环
{{ ls }}
{% for i in ls %}
    {% if  forloop.last  %}
        <p>最后一次循环</p>
    {% endif %}
{{ i }}
{% endfor %}

<p>第二次循环</p>
<p>反向循环</p>
{% for l in ls reversed %}
{{ l }}
{% endfor %}

自定义inclusion_tag

from django import template

register = template.Library()

# 自定义inclusion_tag(局部的html文件)
# 制作完之后 , 在html中就相当于有个标签直接导入
# {% %}
@register.inclusion_tag('text.html')
def text():
    ls = [
        '山野村夫-3098',
        '萘唐',
        '宇杰',
        'lose-',
        '望舒'
    ]
    # locals 把函数中的所有数据传递到指定html中
    return locals()
<ul>
    {% for l in ls %}
        <li>{{ l }}</li>
    {% endfor %}
</ul>
{% load mytag %}
<div class="text-right">{% text %}</div>

二、ORM

必须要会sql语句。

django自带的一个小型的数据库——sqlite3 , 功能比较少;一般情况用于测试使用

ORM通过Mapping的映射可以使用通过类和类对象来操作数据库中的表。ORM框架的存在可以通过类的方式来生成数据表

ORM将类对象的操作转换成sql语句;将在数据库查询的结果转换为类对象的格式返回。

在django中配置数据库

DATABASES = {
    # 默认使用的数据库
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        # 所有键值对的键名必须大写
        # HOST 可以为空 , 表示使用的数据库服务和当前项目是在同一个主机上。
        'HOST': '127.0.0.1',
        # PORT:可以为空 , MySQL数据库默认的端口为3306
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': 'root',
        # 链接的数据库名称 , 连接前一定要先创建好这个数据库
        'NAME': 'day8'
    }
}

django在操作数据库时需要:

1、在settings中配置好要使用的数据库
2、定义模型类
3、数据迁移
4、通过类对象操作数据(增删改查)

在models中创建模型类

所有的模型类都必须继承Model类

# 创建模型类
class Student(models.Model):
    # id int primary key
    # primary_key=True 表示当前字段为主键字段
    # AutoField 表示自增的字段
    id = models.AutoField(primary_key=True)
    # CharField 字符串类型的字段
    # name char(10)
    # 在模型类中 字符串字段必须定义最大的长度
    name = models.CharField(max_length=10)
    # age int
    age = models.IntegerField()

数据迁移

在完成数据库配置以及模型类的定义之后 , 进行操作。django必须在数据迁移之后才可以进行数据的增删改查操作。

第一步:执行makemigrations ,生成数据迁移文件(记录你操作数据库的情况)

python manage.py makemigrations

接着执行migrate命令

python manage.py migrate

迁移完成之后 , 在对应的数据库中会有django生成的迁移表 , 以及一个应用名称开头的表 , 这个表就是我们在模型类中创建的数据库。

在tests中单独运行需要依赖django项目配置的一些数据。

在项目中shell环境中操作数据 ,

python manage.py shell
>>> from app01.models import Student
# 添加数据
>>> ac = Student.objects.create(name='阿宸',age=26)
# 查询所有的数据 , 返回的是一个对象 , QuerySet 查询集
# Student.objects.all 相当于: select * from student
>>> data = Student.objects.all()
>>> print(data)
<QuerySet [<Student: Student object (1)>]>
>>> for i in data:
...     print(i)
...     
Student object (1)
>>> for i in data:
...     print(i.id , i.name , i.age)
...         
1 阿宸 26

# Student.objects.filter(name='阿宸') 
# 相当于: select * from student where name='阿宸';
>>> data = Student.objects.filter(name='阿宸')
>>> data
<QuerySet [<Student: Student object (1)>]>
>>> for i in data:
...     print(i.id , i.name , i.age)
...     
1 阿宸 26
>>> data = Student.objects.filter(name='七零')
>>> data
<QuerySet []>

下载pillow

pip install pillow

pip install Pillow-9.5.0-cp312-cp312-win_amd64.whl

pillow学习网站
http://c.biancheng.net/pillow/
from django.shortcuts import render
from django.http import FileResponse
# Create your views here.
from PIL import Image , ImageDraw , ImageFont
from random import randint , choice

# 制作随机验证码 , 数字, 大小写字母
def get_random_char():
    # 随机数字
    num = str(randint(0,9))
    # 随机小写字母
    lower = chr(randint(97 , 122))
    # 随机大写字母
    upper = chr(randint(65 , 90))
    # 生成三个字符 ,再从三个中随机获取一位
    char = choice([num , lower , upper])
    return char

# 制作图片 , 写入数据
def create_img(request):
    # 创建图片
    img = Image.new(mode='RGB' , size=(160 , 30) , color=(100,100,100))
    # 创建操作图片的工具 , 相当于画笔
    draw = ImageDraw.Draw(img)
    # 设置字体,导入字体的文件 ,字体大小
    font = ImageFont.truetype(font='arial.ttf' , size=24)
    # 创建空变量记录验证码
    code = ''
    for i in range(5):
        c = get_random_char()
        # 讲验证码写入到图片中 , 根据坐标
        draw.text((10+30 * i , 2) , text=c , fill = (255,255,255) , font=font)
        # 拼接验证码字符
        code += c

    # 函数执行完之后内存就消失

    f = open("yzm.png" , "wb")
    # 将绘制好的图片写入打开的文件中
    img.save(f , format='png')
    f.close()
    # 返回验证码图片
    return FileResponse(open("yzm.png" , "rb"))

def register(request):
    return  render(request , 'register.html')

1、字段类型

字段类型 说明
AutoField 自动增量,32位整数。取值:1 ~ (2^31)-1
BigAutoField 自动增量,64位整数。取值:1 ~ (2^63)-1
BigIntegerField 64位整数。取值:-2^63 ~ (2^63)-1。字段默认表单控件为TextInput
BinaryField 存储原始的二进制数据
BooleanField 存储True或者False,字段默认表单控件为CheckboxInput
CharField 存储字符串。字段默认表单控件为TextInput
DateField 存储日期,字段值为datetime.date实例。字段默认表单控件为TextInput;参数auto__now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False;参数auto._now__add表示当对象第一次 被创建时自动设置当前时间,用于创建的时间戳,它总使用当前日期,默认为False;参数auto._now__addauto__now是相互排斥的, 组合将会发生错误.
DateTimeField 存储日期时间,字段值为datetime.datetime实例。字段默认表单控件为TextInput
DecimalField 存储固定精度的十进制数字段,字段值为Decimal实例。字段默认表单控件为NumberInput;参数max__digits表示总位数,参数decimal__places表示小数位数
DurationField 存储时间段
EmailField 存储E-mail地址
FileField 存储文件,字段默认表单控件为ClearableFileInput
FilePathField 存储文件路径
FloatField 存储浮点数。字段默认表单控件为NumberInput
ImageField 存储图片。字段默认表单控件为ClearableFileInput
IntegerField 存储整数。取值:-2^31 ~ (2^31)-1
GenericIPAdderssField 存储字符串格式的IPv4或者IPv6地址。字段默认表单控件为TextInput
PositiveIntegerField 存储非负整数,取值:0~ (2^31)-1
PositiveSmallIntegerField 存储非负小整数。取值:0~ (2^15)-1
SmallIntegerField 存储小整数 , 取值范围-2^15 ~ (2^15)-1
TextField 存储大量文本。字段默认表单控件为Textarea
TimeField 存储时间。字段值为datetime.time实例 ,字段默认表单控件为TextInput
URLField 存储URL。字段默认表单控件为TextInput
SlugField 存储Slug数据 , 只包含字母、数字 、下换线或连字符

2、字段选项

选项 说明
Null 默认为False。为True时,Django在字段没有数据时将空值NULL存储数据库(字符串字段存储空字符串)
blank 默认为False。为True时,字段允许为空,即表单验证允许输入空值。blank影响数据验证,null影响数据库数据存储
choices 为字段定义选择项。字段值为选项中的列表或者元组的值
db_column 定义字段在数据库表中的列名称,为设置时,Django用模型中的字段名作为数据库表的列名称
db_index 为True时,为该字段创建数据库索引
db_tablespace 若为字段创建了索引,则为字段索引设置数据库的表空间名称
default 设置字段默认值
editable 默认是True。为False时,字段不在模型表单中显示
error_messages 设置错误提示信息。该设置会覆盖默认的错误提示信息
help_text 设置字段的帮助信息
primary_key 设置为True时,字段成为模型的主键
unique 设置为True时,字段值在整个表中必须是唯一的
unique_for_date 设置日期或者日期时间字段名,关联的两个字段值在整个表中必须是唯一的
unique_for_month 类似unique_for_date。与关联的月份唯一
unique_for_year 类似unique_for_date。与关联的年份唯一
verbose_name 为字段设置备注名称
validators 为字段设置校验器

3、字段查找类型

查找类型 说明
exact 完全符合。例如:question_exact='text' 等同于where question='text'
iexact 与exact类似,但不区分字母大小写
contains 包含,区分字母大小写。例如question_contains = 'text' 等同于 where question like '%text%'
icontains 包含,不区分字母大小写
in 在指定项中进行匹配。例如id_in = [3,5] 等同于 where id in(3,5),表达式可以是列表、元组、字符串、也可以是filter()、exclude()和get()等方法返回的包含当个字段值的查询集(QuerySet)
gt 大于。例如id_gt = 3 等同于 where id >3
gte 大于等于。例如id_gte = 3 等同于 where id >=3
lt 小于。例如id_lt = 3 等同于 where id ❤️
lte 小于等于。例如id_lte = 3 等同于 where id <=3
startswith 匹配字符串开头,区分大小写。例如question_startswith = 'text' 等同于 where question like 'text%'
istartswith 匹配字符串开头,不区分大小写。例如question_istartswith = 'text'
endswith 匹配字符串结尾,区分大小写。例如question_endswith = 'text' 等同于 where question like '%text'
iendswith 匹配字符串结尾,不区分大小写。例如question_iendswith = 'text'
range 范围测试。例如id_range(1 , 5) 等同于 where id between 1 and 5
date 查找datetime字段。例如rgDate_date = datetime.date(2023,5,31),可以和其他字段查找类型结合使用。例如rgDate_date_gt = datetime.date(2023,5,31)
time 查找datetime字段。例如rgDate_data = datetime.time(10,30),可以和其他字段查找类型结合使用。例如rgDate_data_gt = datetime.time(10,30)
isnull 取值True或者False,测试数据是否为NULL。例如:question_isnull = True 等同于 where question is NULL
regex 使用正则表达式进行匹配,区分大小写。例如,question_regex = "[1]*"
iregex 使用正则表达式进行匹配,不区分大小写。例如,question_iregex = "[2]*"

  1. a-z0-9 ↩︎

  2. a-z0-9 ↩︎