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

原文地址:https://www.cnblogs.com/csic716/p/12174229.html