CSIC_716_2020109【Django入门---models中的常用字段、字段内的关键字参数、数据库优化查询、开启事务】
常用字段
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