字段后设置属性verbose_name=' ' 能够将该字段在admin后台以中文名展现git
一、主键字段:AutoField(primary_key = True) 能够不写Django会自动添加一个名为id的主键字段,必须填primary_key = True数据库
二、varchar(32):CharField(max_length = 32,verbose_name='名字') Django只有varchar字符类型字段,且必需要写max_lengthdjango
三、int:IntegerField() 整型能够不传数字,默认是11位框架
四、bigint:BigIntegerField() 长整型,存更多的数字fetch
五、decimal:DecimalField(max_digits=8, decimal_places=2) 存小数数字总共max_digits,小数位decimal_places优化
六、date:DateField() 存年月日日期,能够设置格式化时间,能够传auto_now和auto_now_addatom
auto_now:每次编辑数据的时候都会自动更新该字段时间url
auto_now_add:只在建立的时候自动更新spa
七、datetime:DateTimeField() 存年月日时分秒,能够设置格式化时间,能够传auto_now 和 auto_now_addcode
auto_now:每次编辑数据的时候都会自动更新该字段时间
auto_now_add:只在建立的时候自动更新
八、varchar(254):EmailField()
九、bool:BooleanField() 给该字段传布尔值会对应生成数字 0/1
十、文本类型:TextField 能够存储大段文本
十一、FileField(upload_to=" ") 字符串路径保存到数据库,文件上传到指定的目录,给该字段传文件对象,文件会自动保存到upload_to指定的文件夹下
十二、ImageField(upload_to="文件夹", default="设置文件夹下的默认图片")
咱们以自定义一个char类型字段为例
一、默认字段都继承了Field类,咱们先导入Field
from django.db.models import Field
二、自定义char类型字段继承Field
class MyCharField(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
三、自定义后使用
class Movie(models.Model): title = MyCharField(max_length=64)
null:通常在一张表中已经有字段了,再新添加一个字段时使用设置为null=True,也能够新建字段时设置能够为空
default:通常在一张表中已经有字段了,再新添加一个字段时使用设置以前的数据该字段默认值,也能够初始设置一个默认值数据
Django 1.x版本使用的是级联更新级联删除,2.x版本须要手动指定
当数据可以被列举完,能够供用户选择的时候,能够考虑用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 = ( ('vacate', "请假"), ('late', "迟到"), ('noshow', "缺勤"), ('leave_early', "早退"), ) record = models.CharField('上课记录', choices=record_choices, default='checked', max_length=32)
二、使用choices,取值的时候使用对象.get_xxx_display()来获取choices后面具体的值,当choices中没有该数据对应的时候获取的仍是数字自己
user_obj = models.Userinfo.objects.get(pk=1) # 针对choices参数字段 取值的时候 get_xxx_display() print(user_obj.get_gender_display()) # 男 # 针对没有注释信息的数据 get_xxx_display()获取到的仍是数字自己 user_obj = models.Userinfo.objects.get(pk=4) print(user_obj.get_gender_display()) # 4
查询时想看见SQL原生语句能够在配置文件中配置一下
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
Django的ORM查询都是惰性查询,即不使用该查询获得的对象时,即便写了该条查询语句也不会去数据库中查询,只有当后面使用到了才会去数据库中查询
only的做用:括号内传字段,获得的结果是一个列表套数据对象,该对象内只含有括号内指定的字段属性,对象点该字段属性是不会走数据库的,可是一旦点了非括号内的字段也能够拿到数据,可是要从新走数据库
res = models.Publish.objects.only('name') for i in res: # print(i.name) # 括号中数据是only内的属性只会查询一次 print(i.addr) # 括号中数据不是only查询的每个都会从新去数据库中查找
defer的做用:与only相反,获得的结果是列表套数据对象,经过对象点括号内的字段会重复走数据库查询,当对象点非括号内的字段就不会走数据库
res = models.Book.objects.defer('name') for i in res: # print(i.name) # 括号中数据是only内的属性每次查询会重复查询数据库 print(i.price) # 括号中字段不是defer内字段,查询只会查询一次
select_related: 内部时连表操做,将关系表所有连接起来,以后再一次性查询封装到对象中,再经过对象点属性就不须要走数据库了,select_related括号内只能是外键字段,而且不能是多对多,只能能是一对一或一对多
res = models.Book.objects.select_related('publish') for i in res: # print(i.publish.name) print(i.publish.addr)
prefetch_related:内部时子查询,可是感受像是连表操做,其实内部时子查询将所有的封装到对象中以后对象点当前表或者关联表中字段就不须要走数据库了
res = models.Book.objects.prefetch_related('publish') for i in res: # print(i.publish.name) print(i.publish.addr)
select_related与prefetch_related优缺点比较:
select_related连表操做 只走一个SQL查询,耗时耗在连表操做
prefetch_related子查询 走两次SQL查询耗时耗在查询次数
事务的四大特性ACID:原子性、一致性、隔离性、持久性(在数据库中讲过此处就不细讲了)
一、Django ORM开启事务:
from django.db import transaction
二、使用事务
with transaction.atomic(): # 在with代码块中执行ORM语句属于同一个事务,代码块运行结束事务就结束了
MTV:Django号称MTV框架,其实本质上也是MVC
M:models 模型层
T:templates 模板层
V:views 视图层
MVC:
M:models 模型层
V:views 视图层
C: controller 控制器(路由分发 urls.py)