模型的定义
启动服务时修改ip和端口
python manage.py ip:port
python manage.py port
创建app
python manage.py startapp app
注册app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
]
创建模型
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=10, unique=True, verbose_name='姓名')
age = models.IntegerField(default=18, verbose_name='年龄')
gender = models.BooleanField(default=1, verbose_name='性别')
# auto_now_add:创建数据时,默认create_time字段为当前时间
create_time = models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')
# auto_now:修改时间,每次update学生信息时,修改该字段的时间为当前的时间
operate_time = models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')
def __str__(self):
return self.name
class Meta:
# 指定student模型映射到数据库中时,对应的表名
db_table = 'student'
verbose_name = '学生'
verbose_name_plural = '学生'
配置完数据库之后,生成迁移文件,执行迁移
python manage.py makemigrations
生成的迁移文件后在migrations目下生成了一个0001_initial.py文件
执行迁移
python manage.py migrete
完成后在数据库生成了app_student表
models定义了很多种属性,涵盖了关系型数据库中的所有类型
看下几种常用的属性:
类型 | 说明 |
---|---|
models.BigAutoField | 自增长列,一般用于主键 |
models.CharField | 最常用的需要定义长度 |
models.BooleanField | 布尔类型 |
models.DateField | 日期类型 |
auto_now | 代表每次更新是否设置为当前时间 |
auto_now_add | 代表只有第一次创建时会设置为当前时间。这两个入参很明显一个用在createDate场景,一个用在updateDate场景。 |
models.Decimal | 必须设置精度 |
models.IntegerField | 整型 |
models.TextField | 大文本类型 |
每个model还定义了一个元数据信息:
定义 | 说明 |
---|---|
db_table | 对应在数据库中的表名 |
managed | 是否被python manage.py来管理 |
index_together | 联合索引 |
unique_together | 联合唯一约束 |
ORM:对象关系映射
查:
常用的查询方式有:
Get:直接通过条件获取确定的model对象,例如:
resource = Resource.objects.get(id=resource_id)
Filter:相当于where条件过滤
resource = Resource.objects.filter(job_id=job_id,type_id=1).first()
删除:
模型 对象.delete()
def del_stu(request):
"""
实现删除
"""
# 1.查询name='大锤'的信息
Student.objects.filter(name='大锤').delete()
return HttpResponse('删除成功')
修改:
对象.属性 = 新值
对象.save()
def update_stu(request):
"""
修改学生信息
"""
# 第一种方式
stu = Student.objects.filter(name='小明').first()
# # 获取学生对象
stu.name = '大明'
stu.save()
# 第二种方式
# Student.objects.filter(name='大明').update(name='小小明')
return HttpResponse('更新成功')
添加:
def add_stu(request):
"""
向数据库中的student表中插入数据
"""
# 第一种方式创建:save()
# stu = Student()
# stu.name = '小明'
# # 向数据库中插入一条数据
# stu.save()
# 第二种方式
Student.objects.create(name='小花', age=19)
return HttpResponse('创建成功')
Django内置字段:
Field
required=True, 是否允许为空
widget=None, HTML插件
label=None, 用于生成Label标签或显示内容
initial=None, 初始值
help_text='', 帮助信息(在标签旁边显示)
error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}
show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)
validators=[], 自定义验证规则
localize=False, 是否支持本地化
disabled=False, 是否可以编辑
label_suffix=None Label内容后缀
CharField(Field)
max_length=None, 最大长度
min_length=None, 最小长度
strip=True 是否移除用户输入空白
IntegerField(Field)
max_value=None, 最大值
min_value=None, 最小值
FloatField(IntegerField)
...
DecimalField(IntegerField)
max_value=None, 最大值
min_value=None, 最小值
max_digits=None, 总长度
decimal_places=None, 小数位长度
BaseTemporalField(Field)
input_formats=None
时间格式化
DateField(BaseTemporalField) 格式:2015-09-01
TimeField(BaseTemporalField) 格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
DurationField(Field) 时间间隔:%d %H:%M:%S.%f
...
RegexField(CharField)
regex, 自定制正则表达式
max_length=None, 最大长度
min_length=None, 最小长度
error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}
EmailField(CharField)
...
FileField(Field)
allow_empty_file=False 是否允许空文件
ImageField(FileField)
...
注:需要PIL模块,pip3 install Pillow
以上两个字典使用时,需要注意两点:
- form表单中 enctype="multipart/form-data"
- view函数中 obj = MyForm(request.POST, request.FILES)