zoukankan      html  css  js  c++  java
  • orm 常用字段

    常用字段

    AutoField ()
    
    i  nt自增列,必须要填入的参数primary-key=True。当model中如果没有只增列,则会自动创建一个名为id的自增列。
    
    IntegerFeild()
    
      一个整数类,范围在-2147483648 to 2147483647。(一般不用它来存手机号(因为位数不够))
    
    CharField()
    
      字符类型,必须提供max_length参数,其中max_length表示字符长度。在Django中的CharField对应的是Mysql数据库中的varchar类型,没有对应char类型的字段。
    
    DateField()
    
      日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。
    
    DateTimeField()
    
      日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
    
      auto_now_add: 配置auto_now_add=True,只在第一次创建数据的时候才会更新一次。
    
      auto_now: 配置上auto_now=True,每次修改数据都会更新时间。
    
    BooleanField(Field)
    
      is_delete = BooleanField():给该字段传值的时候,只需要传布尔值即可。但是对应到数据库,它存的是0和1。
    
    TextField(Field)
    
      文本类型,用来存大段文本
    
    FileField(Field)
    
      字符串,路径保存在数据库,文件上传到指定目录。
    
      upload_to = "  " 用户上传的文件会自动放到等号后面指定的文件路径中
    
      storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
    

    自定义char参数

    class MyChar(models.Field):
    	def __init__(self,max_length,*args,**kwargs):
    		self.max_length = max_length
    				super().__init__(max_length=max_length,*args,**kwargs)
    
    	def db_type(self, connection):
    		return 'char(%s)'%self.max_length    
    
    null
    
      用于表示某个字段可以为空。
    
    unique
    
      如果设置为unique=True 则该字段在此表中必须是唯一的 。
    
    db_index
    
      如果db_index=True 则代表着为此字段设置索引。
    
    default
    
      为该字段设置默认值。
    

    关系字段(ForeignKey)

      外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
    
    
    to
    
      设置要关联的表
    
    to_field
    
      设置要关联的表的字段
    
    on_delete
    
      当删除关联表中的数据时,当前表与其关联的行的行为。
    
    models.CASCADE
    
      删除关联数据,与之关联也删除
    
    db_constraint
    
      是否在数据库中创建外键约束,默认为True。
    

    其余字段参数

    models.DO_NOTHING    #删除关联数据,引发错误IntegrityError
    models.PROTECT     #删除关联数据,引发错误ProtectedError
    models.SET_NULL    #删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
    models.SET_DEFAULT    #删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
    
    models.SET    #删除关联数据,
    	a. 与之关联的值设置为指定值,设置:models.SET(值)
    	b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    

    数据库查询优化

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

    only与defer

    res = models.Book.objects.all()
    print(res)
    
    res = models.Book.objects.values('title')
    # print(res)
    for r in res:
    	print(r.title)
    
    res = models.Book.objects.only('title')
    # print(res)
    for r in res:
    	# print(r.title)  # 只走一次数据库查询
    	print(r.price)  # 当你点击一个不是only括号内指定的字段的时候 不会报错 而是会频繁的走数据库查询
    
    res1 = models.Book.objects.defer('title')  # defer与only是相反的
    for r in res1:  # defer会将不是括号内的所有的字段信息 全部查询出来封装对象中
    	# 一旦你点击了括号内的字段  那么会频繁的走数据库查询
    	print(r.price)
    

    select_releated与prefect_releated

      select_related帮你直接连表操作,查询数据,括号内只能放外键字段。

    res = models.Book.objects.all().select_related('publish')
    	for r in res:
    		print(r.publish.name)
    
    res=models.Book.objects.all().select_related('publish__xxx__yyy__ttt')
    	print(res)
    res = models.Book.objects.all()
    """
    select_related:会将括号内外键字段所关联的那张表 直接全部拿过来(可以一次性拿多张表)跟当前表拼接操作
    从而降低你跨表查询 数据库的压力
    
    注意select_related括号只能放外键字段(一对一和一对多)
    res = models.Book.objects.all().select_related('外键字段1__外键字段2__外键字段3__外键字段4')
    """
    
    res = models.Book.objects.prefetch_related('publish')
    """
    不主动连表操作(但是内部给你的感觉像是连表操作了) 而是将book表中的publish全部拿出来 在取publish表中将id对应的所有的数据取出
    res = models.Book.objects.prefetch_related('publish')
    括号内有几个外键字段 就会走几次数据库查询操作
    """
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/daviddd/p/12205541.html
Copyright © 2011-2022 走看看