• 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查询的次数来进行优化、提高性能
    
  • 相关阅读:
    url_encode and url_decode in Shell
    学嵌入式技术,做高端电子工程师
    MCU助推居家移动医疗微型化
    深圳单片机培训,7月盛大开班,报名既送
    中国嵌入式工控机市场前景广阔
    嵌入式 现已发展为 IT行业的主流——高薪,且人才缺乏
    谷歌苹果已“技穷”?移动操作系统2013无创新
    C# 与 C++,语法差别有多小-其他2
    link
    C# 与 C++,语法差别有多小-第三章 C++数据类型 第一部分
  • 原文地址:https://www.cnblogs.com/luodaoqi/p/11750561.html
Copyright © 2020-2023  润新知