Django模型类似于java语言中的jpa一样,减少创建数据的数据,简化在开发中数据库中的操作。
from django.db import models
from django.urls import reverse
# Create your models here.
class UserBaseInfo(models.Model):
id = models.AutoField(verbose_name='编号', primary_key=True)
username = models.CharField(verbose_name='用户名称', max_length=30)
password = models.CharField(verbose_name='密码', max_length=20)
status = models.CharField(verbose_name='状态', max_length=1)
createdate = models.DateTimeField(
verbose_name='创建日期', db_column='createDate')
def __str__(self):
return str(self.id)
class Meta:
verbose_name = '人员基本信息'
db_table = 'UserBaseInfo4'
字段类型
| 字段 | 说明 | 对应mysql字段 |
|---|---|---|
| AutoField | 自增的主键 | Int |
| BooleanField | 布尔字段 | Tinyint |
| CharField | 字符类型 | varChar |
| DateField | 日期 | Date |
| DateTimeField | 日期时间类型 | DateTime |
| IntergetField | 整数类型 | Int |
| TexField | 长文本 | Longtext |
| TimeField | 时间 | Time |
| FloatField | 浮点数 | Double |
| FileField | 字符类型 | varChar |
| ImageField | 字符类型 | varChar |
| DecimalField | 数值类型 | Decimal |
属性备注:
DecimalField:
- max_digits:最大位数
- decimal_places:小数的最大位数
字段时间类型有auto_now_add和auto_now
| 字段 | 说明 |
|---|---|
| verbose_name | 字段的显示名称 |
| primary_key | 设置字段是否为主键 |
| editable | 是否可编辑 |
| max_length | 最大长度 |
| blank | 是否可以为空,默认是false |
| null | 是否可以为空,默认是false |
| default | 默认值 |
| choices | 可选值 |
| db_column | 列名称 |
| db_index | 是否建立索引 |
| unique | 是否建立唯一性 |
| error_messages | 自定义错误信息 |
| validators | 自定义错误验证 |
设置模型的返回值
Meta类用于定义Django模型的行为
| 字段 | 说明 |
|---|---|
| abstract | 是否为抽象类 |
| db_table | 表名 |
| managed | Django会管理表的生命周期和迁移等 |
| ordering | 返回数据按照那个字段排序 |
| verbose_name | 模型在后台显示的名称 |
| index_together | 联合索引 |
| unique_together | 联合约束 |
- 一对一
OneToOneField
参数:
to 模型名称
to_field 关联的字段名称
on_delete 删除的配置
| 字段 | 说明 |
|---|---|
| CASCADE | 级联删除 |
| PROTECT | 删除时出错 |
| SET_NULL | null = True是设置null时置空 |
| SET_DEFAULT | 设置默认值 |
| SET | 设置为指定的值 |
| DO_NOTHING | 不做操作 |
models.OneToOneField()
- 一对多
ForeignKey - 多对多
ManyToManyField
配置数据库连接工具,默认是用的sqlite3,这里修改为mysql,并配置了日志。
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'POST': '3306',
# 取消外键约束
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;",
},
}
}
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
}
},
}
然后生成对应数据表
- 生成迁移文件
python manage.py makemigrations
- 执行迁移
查询语句python manage.py migrate
- all()
查询所有的语句
In [1]: from app3.models import * In [2]: users = UserBaseInfos.objects.all() In [3]: print(users[0].username) (0.000) SELECt @@SQL_AUTO_IS_NULL; args=None (0.000) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; args=None (0.000) SELECT `UserBaseInfo4`.`id`, `UserBaseInfo4`.`username`, `UserBaseInfo4`.`password`, `UserBaseInfo4`.`status`, `UserBaseInfo4`.`createDate` FROM `UserBaseInfo4` LIMIT 1; args=() 背景墙
- filter()
删选指定的值,返回一个结果列表
- get()
获取一个结果集,返回多条数据报错。
users = UserBaseInfos.objects.get(id=1)
print(users.username)
- exclude()
排除符合条件的语句,返回结果集
| 操作符 | 含义 | 例子 |
|---|---|---|
| __gt() | 大于 | filter(age__gt=20) |
| __gte() | 大于或等于 | filter(age__gte=20) |
| __lt() | 小于 | filter(age__lt=20) |
| __lte() | 小于或等于 | filter(age__lte=20) |
| __in() | 在某个列表 | filter(age__in=[1,0]) |
| __contains() | 模糊匹配 | filter(age__contains=‘张’) |
| __year()/__month()/__day() | 日期匹配 | filter(createdate__year=2011) |
-
values()
提取对应字段 -
distinct()
新增和更新数据users = UserBaseInfos.objects.distinct().values(‘department’)
使用sava()保存更新数据,create()也可新增数据。
users = UserBaseInfos.objects.get(id=1)
users.username = "Django.js"
users.save()
删除数据
delete()方法删除数据
F函数和Q函数F函数可以更新字段,更新之后使用refresh_from_db()
user.salary = F(“salary”) + 1000
Q函数可以支持条件查询
运行原生的SQLfilter(Q(age__gt=30)&Q(salary__gt=5000))
使用django.db.models.Manager.raw()执行SQL,也可以执行带参数的SQL语句,使用[]来传入参数。
users = UserBaseInfos.objects.raw("select * from UserBaseInfo4")
print(users[0].username)
事务
事务的ASID特性:原子性、一致性、隔离性和持久性
Django中事务主要有装饰器方式和with语句。
@transaction.atomic def trans(request): save_id = transaction.savepoint() try: --- transaction.savepoint_commit(save_id) except: transaction.savepoint_rollback(save_id)



