常用字段
AutoField(primary_key=True) 主键字段
CharField(max_length=32) varchar(32)
IntegerField() int
BigIntergerField() bigint
DecimalField() decimal
EmailField() varchart(254)
DateField() date
DateTimeField() datetime
auto_now:每次编辑数据的时候都会自动更新该字段时间
auto_now_add:创建数据的时候自动更新
BooleanField(Field)
给该字段传布尔值 会对应成 数字0/1
is_delete
is_status
is_vip
TextField(Field)
- 文本类型
存储大段文本
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
upload_to = '指定文件路径'
给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
如何自定义char类型字段
from django.db.models import Field
class RealCharField(Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length # 拦截一个父类的方法 操作完之后 利用super调用父类的方法
super().__init__(max_length=max_length, *args, **kwargs)
def db_type(self, connection):
return 'char(%s)' % self.max_length
choices参数
类似于枚举:
先定义一个大元组gender_choice代表可以选择的范围,大元组里套若干个小元组,小元组里放两个元素,第一个是存数据库的值,第二个是展示到前端的值。
定义字段(gender)的时候,里面用字段choices代表可以选择的值,
如gender = models.CharField(max_length = 32, choices = gender_choice)。
取值的时候 对象.get_xxx_display() 如:user_obj.get_gender_display()
choices参数
用户的性别
学历
婚否
在职状态
客户来源
当你的数据能够被你列举完全
你就可以考虑使用choices参数
class Userinfo(models.Model):
username = models.CharField(max_length=32)
gender_choices = (
(1, '男'),
(2, '女'),
(3, '其他'),
)
gender = models.IntegerField(choices=gender_choices)
# 该字段还是存数字 并且可以匹配关系之外的数字
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
user_obj = models.Userinfo.objects.get(pk=1)
print(user_obj.username)
print(user_obj.gender)
# 针对choices参数字段 取值的时候 get_xxx_display()
print(user_obj.get_gender_display())
# 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身
user_obj = models.Userinfo.objects.get(pk=4)
print(user_obj.gender)
print(user_obj.get_gender_display())
数据库优化查询
defer延期,括号内的延期取
only只有,只取括号内的

select_related与prefetch_related
select_related(连表操作)
select_related 会进行连表操作,连接所有有关系的表,并只查询一次。得到相关表的所有字段信息封装到结果对象中。以后需要查属性只需要通过句点符就行,不再进行数据库查询。
select_related()的括号内只能传外键字段,并且不能是多对多的外键。
select_related(外键1__外键2__外键3),通过外键可以无限连表。
prefetch_related(子查询) prefetch数据预取
内部通过子查询的方式(因为数据库语句会执行两(多)次,将第一条的结果作为第二条语句的条件),将外键相关的表和本表中所有的字段存到结果对象中,取值也只需要通过句点符取值。
多对对的外键只能通过这种方式。
https://www.cnblogs.com/tuifeideyouran/p/4232028.html
django orm开启事务操作
事务的四大特性 acid
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
数据库中开启事务
try:
sql语句代码块
except 异常:
rollback;
else:
commit;
数据库的三大范式设计:
第一范式(NF1):每个字段要有原子性,不可再分割 第二范式(NF2):每个字段与主键要有相关性。 第三范式(NF3):每个字段与主键要直接相关,而不是间接相关
django orm中开启事务操作
from django.db import transaction
with transaction.atomic():
# 在with代码块中执行的orm语句同属于一个事务
pass
事务相关的其他配置 有待补充
MTV与MVC模型
MTV
django号称是MTV框架
M:models
T:templates
V:views
MVC
M:models
V:views
C:controller 控制器(路由分发 urls.py)
本质:MTV本质也是MVC
ding