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__add 和auto__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]*" |