Dango 常用字段和参数

Posted luodaoqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dango 常用字段和参数相关的知识,希望对你有一定的参考价值。

一、Django ORM 常用字段和参数

1.常用字段

models中所有的字段类型其实本质就那几种,整形varchar什么的,都没有实际的约束作用,虽然在models中没有任何限制作用,但是还是要分门别类,对于校验性组件校验非常有用
就比如说邮箱类型,你在输入邮箱的时候如果不按照邮箱格式输入,瞎鸡儿输入会提示你不合法,虽然输入的是字符串,但是不是规定的邮箱字符串

AutoField()  【int primary key auto_increment)】 int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

IntegerField()  【int()】一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存

CharField()  【varchar()】 字符类型,必须提供max_length参数, max_length表示字符长度。

DateField()   【date】日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。

DateTimeField()   【datetime】日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例

EmailField()   【varchar(254)】其实就是varchar但是不能直接写成varchar,就比如男人女人都是人,但是必须说清楚,后面会用于校验性组件的校验

BooleanField()
  is_delete = BooleanField()
  给该字段传值的时候 你只需要传布尔值即可
  但是对应到数据库 它存的是0和1
TextField()
  - 文本类型用来存大段文本
FileField()
  - 字符串,路径保存在数据库,文件上传到指定目录
  - 参数:
      upload_to = "path" 用户上传的文件会自动放到等号后面指定的文件路径中
      storage = None 存储组件,默认django.core.files.storage.FileSystemStorage

自定义char:

Django中的CharField对应的mysql数据库中的varchar类型,没有设置对应char类型的字段,

但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型

自定义字段在实际项目应用中可能会经常用到

2.字段参数

null  用于表示某个字段可以为空。

unique  如果设置为unique=True 则该字段在此表中必须是唯一的 。

db_index  如果db_index=True 则代表着为此字段设置索引。

default  为该字段设置默认值。

DateField和DateTimeField:

  uto_now_add  配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

  auto_now  配置上auto_now=True,每次更新数据记录的时候会更新该字段

3.choices字段

在很多时候我们往数据库中存数据的时候不会直接存储汉字,会采用数字存取代替汉字,减小内存,

我们使用choices来给数字绑定注释关系,后期取出来的时候用固定语法取出注释,如:1表示男,我们取出来的时候取出男并不是取出数字1

1.绑定关系choices=((1,'男'),(2,'女'),(3,'其他'))
gender = models.IntegerField(choices=choices)
2.取choice里面罗列的数字与中文对应关系:
                固定语法:
                get_字段名_display()
                如:print(user_obj.get_gender_display())

3. 取没有罗列出来的数字
             不会报错,会展示数字,数字是多少就展示多少

二、数据库优化查询

1.update()与save()的区别

两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部重新写一遍,效率极低,比如book_obj.save()会将对象所有属性重新保存一次

而update()则是针对修改的项进行针对的更新效率高耗时少,比如,update(price),指哪打哪只会保存价格这一个属性

所以以后对数据的修改保存用update()

2.惰性查询

查询集 是惰性执行的 —— 创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集 需要求值时,Django 才会真正运行这个查询。

queryResult=models.Article.objects.all() # 只写这一句不会请求数据库
 
print(queryResult) # 直到你需要结果,此时才会查询数据库
 
for article in queryResult:
    print(article.title)    # 这样也会查询

orm内所有的语句操作 都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的
这样设计的好处 在于 减轻数据库的压力

3.only和defer 两对头

#only only会将括号内的所有的字段信息 全部查询出来封装对象中

res = models.Book.objects.only('title')
            for r in res:
            # print(r.title)  # 只走一次数据库查询,将查询到的所有信息封装成一个对象,随后查询这些信息不需要再请求数据库,直接可以用点方法从对象中取出
              print(r.price)  
            # 当你点击一个不是only括号内指定的字段的时候 不会报错 而是会帮你去数据库查询,循环几次查几次,频繁的走数据库查询,当你有成千上万条信息时对数据库造成一万点伤害

#defer defer会将不是括号内的所有的字段信息 全部查询出来封装对象中

 res1 = models.Book.objects.defer('title')  # defer与only是相反的
            for r in res1:  
            # print(r.title)# 查询括号内的字段,会频繁的走数据库查询
            print(r.price)#查询括号内没有的,只走一次
res = models.Book.objects.all()
   for r in res:
      print(r.publish.name) #查询N次,这样是跨表查询,循环一次访问一次数据库,有一千万个书籍就查询一千万次#常规的all方法,查询自己表里没有的属性,就需要跨表查询,虽然可以获取,但是你去查询一次就会访问一次数据库,查询其他表就不推荐这个了#查询自己表里面有的属性时可以使用

#select_related 主动关联表

1. 主要针一对一和多对一关系进行优化。
2. 使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能

以上是关于Dango 常用字段和参数的主要内容,如果未能解决你的问题,请参考以下文章

python常用代码

Unity常用标签

JS常用代码片段-127个常用罗列-值得收藏

提效小技巧——记录那些不常用的代码片段

初谈dango的post提交csrf设置和文件上传

初谈dango的post提交csrf设置和文件上传