django orm 基本Field介绍

ORM:object relational mapping,对象关系映射python

django中使用原生sql的弊端:
  一、SQL语句重复率很高,利用率不高
  二、若是业务逻辑生变,原生SQL更改起来比较多
  三、容易忽略一些web安全问题,如SQL注入git

ORM的优势:
  易用性:使用ORM作数据库的开发能够有效的减小重复SQL语句的几率,写出来的模型也更加直观、清晰。
  性能损耗小:ORM转换成底层数据库操做指令确实会有一些开销。但从实际的状况来看,这种性能损耗不多(不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,并且项目越大做用越明显。
  设计灵活:能够轻松的写出复杂的查询。
  可移植性:Django封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的MySQL、PostgreSQL和SQLite。能够很是轻松的切换数据库。web

ORM经常使用字段类型:
  一、CharField:字符串类型,映射到数据库中会转换成varchar类型,使用时必须传入max_length属性以定义该字符串的最大长度,若是超过254个字符,就不建议使用CharField了,此时建议使用TextField。sql

 

  二、EmailField:在数据库底层也是一个varchar类型,默认最大长度是254个字符,固然也能够本身传递max_length参数,这个Field在数据库层面不会限制必定要传递符合email条件的字符串,只是之后在使用ModelForm表单验证时,会起做用数据库

 

  三、URLField:相似于CharField,在数据库底层也是一个varchar类型,只不过只能用来存储url格式的字符串。而且默认的max_length是200,同EmailFielddjango


  四、FloatField:浮点数类型,映射到数据库中会变成double类型安全


  五、IntegerField:整数类型,映射到数据库中会变成11位的int类型数据结构

 

  六、BigIntegerField:大整形。值的区间是-9223372036854775808——9223372036854775807app

 

  七、PositiveIntegerField:正整形。值的区间是0——2147483647函数

 

  八、SmallIntegerField:小整形。值的区间是-32768——32767

 

  九、PositiveSmallIntegerField:正小整形。值的区间是0——32767

 

  十、BooleanField:布尔类型(True/False),映射到数据库中会变成长度只有1位的tinyint类型,这个Field不接受null参数,要想使用能够为null的布尔类型的字段,就要使用NullBooleanField

 

  十一、AutoField:自增加类型,映射到数据库中是11位的整数,使用此字段时,必须传递primary_key=True,不然在生成迁移脚本文件时,就会报错,一个模型不能有两个自增加字段。通常状况下咱们用不到这个字段,若是不定义主键,django会自动的为咱们生成id字段做为主键

 

  十二、BigAutoField:自增加类型,用法同AutoField。映射到数据库中会成为20位的bigint类型

 

  1三、DateTimeField:日期时间类型,在python中对应的是datetime.datetime类型,在映射到数据库中也是datetime类型。使用这个Field能够传递如下几个参数:
    auto_now=True:在每次这个数据保存的时候,都使用当前的时间。好比做为一个记录修改日期的字段
    auto_now_add=True:在每条数据第一次被添加进去的时候,都使用当前的时间。好比做为一个记录第一次入库的字段
    注意:若是在setting.py中配置了USE_TZ=True,那么上两个默认值都来自于django.utils.timezone.now所转化来的值

    在模板中将一个UTC时间转换成本地时间:
    首先模板HTML文件的开头导入tz:
      {% load tz %}
    在传递过来的时间变量utc_time中使用localtime过滤器:
      {{utc_time | localtime}}
    其实,django知道咱们的想法,已经为咱们作好了配置,咱们并不须要配置其余的东西就能够直接使用{{utc_time}},此时只要咱们在setting.py文件中设置  USE_TZ=True,TIME_ZONE='Asia/Shanghai',UTC时间变量在渲染到模板上的时候会自动的为咱们加载成TIME_ZONE中所设置的时区的时间。

 

  1四、DateField:日期类型,用法同DateTimeField,在python中对应的是datetime.date类型,在映射到数据库中是date类型

 

  1五、TimeField:时间类型,用法同DateTimeField,在python中对应的是datetime.time类型,在映射到数据库中是time类型

 

  1六、FileField:用来存储文件的

 

  1七、ImageField:用来存储图片文件的

 

  1八、TextField:大量的文本类型

 

  1九、DecimalField一个固定精度的十进制数类型,使用时必需要传递两个参数,max_digits数字的最大总长度(不含小数点),decimal_places小数部分的长度

 

Field的经常使用参数:
  一、null:标识是否能够为空,默认是为False。在使用字符串相关的Field(CharField/TextField/URLField/EmailField)的时候,官方推荐尽可能不要使用这个参数,也就是保持默认值False。由于Django在处理字符串相关的Field的时候,即便这个Field的null=False,若是你没有给这个Field传递任何值,那么Django也会使用一个空的字符串""来做为默认值存储进去。所以若是再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。若是想要在表单验证的时候容许这个字符串为空,那么建议使用blank=True。若是你的Field是BooleanField,因为BooleanField不接受null参数,所以你若是想要设置这个字段能够为空的bool类型,那么对应的可空的bool类型字段则为NullBooleanField。

 

  二、blank:标识这个字段在表单验证的时候是否能够为空,默认是False。这个和null是有区别的,null是一个纯数据库级别的。而blank是表单验证级别的。

 

  三、db_column:这个字段在数据库中的名字。若是没有设置这个参数,那么将会使用模型中属性的名字。

 

  四、db_index:标识这个字段是否为索引字段。

 

  五、default:默认值。能够为一个值,或者是一个函数,可是不支持lambda表达式。而且不支持列表/字典/集合等可变的数据结构。在用函数做为值传递给default时,只能传递函数名,不须要加括号。

 

  六、primary_key:是否为主键,与AutoField/BigAutoField连用,默认是False。

 

  七、unique:在表中这个字段的值是否惟一,在数据库中就是惟一约束,通常是设置手机号码/邮箱等。

 

  八、choices:在一个范围内选择出一项,注意这个选项与ForeignKey的区别
    做用:一、django admin中显示下拉框;二、避免连表查询

    TYPE_CHOICES = (   #数据库只保存内部元祖的第一个值,后面的值保存在内存中
      (0, '---'),
      (1, '第一类'),
      (2, '第二类'),
      (3, '第三类'),
    )
    type = models.IntegerField(default=0,choices=TYPE_CHOICES)

 

模型中Meta配置:
  对于一些模型级别的配置。咱们能够在模型中定义一个类,叫作Meta。而后在这个类中添加一些类属性来控制模型的做用。好比咱们想要在数据库映射的时候使用本身指定的表名,而不是使用模型的名称。那么咱们能够在Meta类中添加一个db_table的属性。示例代码以下:

  class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,null=True,blank=True)

    class Meta:
      db_table = 'book_model'

  如下将对Meta类中的一些经常使用配置进行解释。

  一、db_table:这个模型映射到数据库中的表名。若是没有指定这个参数,那么在映射的时候将会使用模型所在app的名称加上模型名的小写来做为默认的表名。

 

  二、ordering:设置在提取数据的排序方式,由于能够按照多个字段以优先关系进行排序,因此须要传递一个字段的列表,在咱们提取数据时,能够根据列表中字段从前到后(优先级从高到低)的方式排序,排序默认为正序,若是你须要哪一个字段按倒序排列,就能够在这个字段前面加上"-"。后面章节会讲到如何查找数据。好比我想在查找数据的时候根据添加的时间排序,那么示例代码以下:

  class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:
      db_table = 'book_model'
      ordering = ['pub_date',]

相关文章
相关标签/搜索