一、模型介绍
1. 创建一个简单的学生模型
class Student(models.Model):
# 继承models.Model
# 定义数据字段
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# 创建数据时间,默认为当前时间: auto_now_add=True
create_time = models.DateTimeField(auto_now_add=True, null=True)
# auto_now : 修改时间, 每次修改学生信息时,修改该字段的时间为当前时间
operate_time = models.DateTimeField(auto_now=True, null=True)
class Meta:
# 指定Student模型映射到数据库中时,对应的表名。
db_table = 'tb_student'
2. 配置数据库
- 2.1 在项目文件夹下的setting.py中修改数据库类型和配置数据库连接信息
如:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dj7',
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': 3306
}
}
- 2.2 其次需要在项目文件夹下的init.py中添加对应的数据库驱动
mysql如下:
import pymysql (如果没有pymysql的需要安装pymysql第三方库)
pymysql.install_as_MySQLdb()
3. 注册应用
- 在项目文件下的setting.py文件中的INSTALLED_APPS最后添加应用名
如:
INSTALLED_APPS = [
这里省略部分默认代码
'app'
]
4. 生成迁移文件
格式: python manage.py makemigrations
- 此时会在项目文件夹下的migration文件夹下创建一个迁移文件
如:0001_initial.py
5. 制作迁移
格式: python manage.py migrate
此时在数据库中就会创建一张与模型向对应的数据库表(其中自动创建一个id字段并且自动增长和是主键)
二、更改启动服务的ip和端口
格式:python manage.py runserver ip:port
或者
格式:python manage.py runserver port
注意:后面参数可以是IP:port 或者 port,不能只是ip
三、Debug(程序调试)
- 在自己认为可能出现错误的地方添加断点,再通过Debug对程序进行检查调试
- python中可以通过debug控制台打印程序运行值检查是否出错
四、通过ORM操作数据库(CRUD操作)
在上面创建的模型基础上通过模型去更改操作数据库表
1. 配置url解析
# 需要先导入app应用下的views(视图)
from app import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 新增数据
# 配置url,并调用相应的视图函数
url(r'add_stu/', views.add_stu),
# 删除数据
url(r'del_stu/', views.del_stu),
# 修改数据
url(r'^up_stu', views.up_stu),
]
2. 在应用(app)文件夹下views.py文件中定义与url相对应的视图函数
# 引入Student模型
from app.models import Student
def add_stu(request):
# 创建向数据库student表中插入数据的函数
# 添加数据
# 方式一:
# stu = Student()
# stu.name = '小明'
# 向数据库中插入数据
# stu.save()
# 方式二:
Student.objects.create(name='大锤11', age=19)
# 返回响应
return HttpResponse('添加成功!')
def del_stu(request):
# 实现删除数据操作
# 1. 先查询name=‘大锤’的信息
Student.objects.filter(name='大锤11').delete()
return HttpResponse('删除成功!')
def up_stu(request):
# 修改student表中的数据
# 方式一:
# stus = Student.objects.filter(name='小明')
# 获取小明对象
# stu = stus[0]
# stu.name = '大锤'
# stu.save()
# 方式二:
# stu = Student.objects.filter(name='小明').first()
# stu.name = '大锤'
# stu.save()
# 方式三:
Student.objects.filter(name='小明').update(name='小明')
return HttpResponse('修改成功!')
五、模型中定义的数据类型和数据库(mysql)中的数据类型的关系
5.1 定义模型
1. 字段要求
字段名不能使python的保留字,否则会导致语法错误
字段名不能有多个连续下划线,否则会影响ORM查询操作
5.2 模型中的数据类型
<center>模型字段类型</center>
字段类 | 说明 |
---|---|
AutoField | 自增ID字段 |
BigIntegerField | 64位有符号整数 |
BinaryField | 存储二进制数据的字段,对应Python的bytes类型 |
BooleanField | 存储True或False |
CharField | 长度较小的字符串 |
DateField | 存储日期,有auto_now和auto_now_add属性 |
DateTimeField | 存储日期和日期,两个附加属性同上 |
DecimalField | 存储固定精度小数,有max_digits(有效位数)和decimal_places(小数点后面)两个必要的参数 |
DurationField | 存储时间跨度 |
EmailField | 与CharField相同,可以用EmailValidator验证 |
FileField | 文件上传字段 |
FloatField | 存储浮点数 |
ImageField | 其他同FileFiled,要验证上传的是不是有效图像 |
IntegerField | 存储32位有符号整数。 |
GenericIPAddressField | 存储IPv4或IPv6地址 |
NullBooleanField | 存储True、False或null值 |
PositiveIntegerField | 存储无符号整数(只能存储正数) |
SlugField | 存储slug(简短标注) |
SmallIntegerField | 存储16位有符号整数 |
TextField | 存储数据量较大的文本 |
TimeField | 存储时间 |
URLField | 存储URL的CharField |
UUIDField | 存储全局唯一标识符 |
常用的类型主要有以下几类(自己总结的)
类型 | 说明 |
---|---|
自增id字段 | AutoField |
数字类型 | IntegerField、FloatField、DecimalField |
字符串类型 | CharField、TextField |
时间类型 | DateField、DateTimeField、TimeField |
文件类型 | FielField、ImageField |
布尔和空 | BooleanField、NullBoolField |
<center>模型字段属性</center>
选项 | 说明 |
---|---|
null | 数据库中对应的字段是否允许为NULL,默认为False |
blank | 后台模型管理验证数据时,是否允许为NULL,默认为False |
choices | 设定字段的选项,各元组中的第一个值是设置在模型上的值,第二值是人类可读的值 |
db_column | 字段对应到数据库表中的列名,未指定时直接使用字段的名称 |
db_index | 设置为True时将在该字段创建索引 |
db_tablespace | 为有索引的字段设置使用的表空间,默认为DEFAULT_INDEX_TABLESPACE |
default | 字段的默认值 |
editable | 字段在后台模型管理或ModelForm中是否显示,默认为True |
error_messages | 设定字段抛出异常时的默认消息的字典,其中的键包括null、blank、invalid、invalid_choice、unique和unique_for_date |
help_text | 表单小组件旁边显示的额外的帮助文本。 |
primary_key | 将字段指定为模型的主键,未指定时会自动添加AutoField用于主键,只读。 |
unique | 设置为True时,表中字段的值必须是唯一的 |
verbose_name | 字段在后台模型管理显示的名称,未指定时使用字段的名称 |
<center>模型元数据选项</center>
选项 | 说明 |
---|---|
abstract | 设置为True时模型是抽象父类 |
app_label | 如果定义模型的应用不在INSTALLED_APPS中可以用该属性指定 |
db_table | 模型使用的数据表名称 |
db_tablespace | 模型使用的数据表空间 |
default_related_name | 关联对象回指这个模型时默认使用的名称,默认为<model_name>_set |
get_latest_by | 模型中可排序字段的名称。 |
managed | 设置为True时,Django在迁移中创建数据表并在执行flush管理命令时把表移除 |
order_with_respect_to | 标记对象为可排序的 |
ordering | 对象的默认排序 |
permissions | 创建对象时写入权限表的额外权限 |
default_permissions | 默认为('add', 'change', 'delete') |
unique_together | 设定组合在一起时必须独一无二的字段名 |
index_together | 设定一起建立索引的多个字段名 |
verbose_name | 为对象设定人类可读的名称 |
verbose_name_plural | 设定对象的复数名称 |