Django之ORM操作

Posted zn-225

tags:

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

Django之ORM操作

  ORM(Object Relational Mapping),对象关系模型,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.

  优势:

    提供了对数据库的映射关系,不用直接编写SQL,只需操作对象就能对数据库操作数据.

  劣势:

    会在一定程度上牺牲程序的执行效率.

    ORM的操作是有限的,有些复杂的操作是完成不了的.

  Model

    在Django中model是你的数据的单一 明确的信息来源.它包含了你存储的数据的重要字段和行为.通常,一个模型(model)映射到一个数据库表.

    基本情况:

      每个模型都是一个Python类,他是django.db.models.Model的子类.

      模型的每个属性都代表一个数据库字段.

      Django提供了一个自动生成的数据库访问API.

技术分享图片

  字段

    常用字段

      AutoField

        自增的整型字段,必填参数primary_key=True,则生成数据库的主键.无该字段时,Django自动创建.

        一个model不能有两个AutoField字段.

      IntegerField

        一个整数类型.数值范围是 -2147483648 ~ 2147483647.(十位数,也就是说使用该字段无法表示手机号).

      CharField

        字符类型.必须提供max_length参数.max_length表示字符的长度.CharField对应的是SQL中的varchar数据类型,max_length的参数代表执行varchar的最大长度.

      DateField

        日期类型.日期格式为YYYY_MM_DD,相当于Python中的datetime.date的实例.

        参数:

          auto_now: 每次修改本条数据记录时,将本字段修改为当前日期时间.

          auto_now_add: 新创建对象时自动添加当前日期时间.

        auto_now和auto_now_add和default参数是互斥的,不能同时设置.

      DateTimeField

        日期时间字段,格式为YYYY_MM_DD HH:MM:[:ss[:uuuuuu]][TZ],相当于python中的datetime.datetime的实例.

    其他字段类型

      BigAutoField(AutoField)

        - bigint自增列,必须填入参数 primary_key=True

        当model中没有自增列,则会自动创建一个名为id的列.

      SmallIntegerField(IntegerField):

        - 小整数 -32768 ~ 32767.

      PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField):

        - 正整数 0~2147483647.

      BigIntegerField(IntegerField):

        - 长整型(有符号)  -9223372036854775808~9223372036854775807

      BooleanField(Field):

        - 布尔值类型

      NullBooleanField(Field):

        - 可以为空的布尔值.

      TextField(Field):

        - 文本类型

      EmailField(CharField):

        - 字符串类型,Django Admin以及ModelForm中提供验证机制,也就是了不提供了一套正则规则.

      IPAddressField(Field):

        - 字符串类型,Django Admin以及ModelForm撞提供了验证IPV4机制.

      GenericIPAddressField(Field):

        - 字符串类型,Django Admin以及ModelForm中提供验证IPV4和IPV6的机制.

        - 参数:

          protocol,用于指定IPV4或IPV6,‘both‘,‘ipv4‘,‘ipv6‘

          unpack_ipv4,如果指定为True,则输入::ffff:192.0.2.1时候,可以解析为192.0.2.1,开启此功能,需要protocol=‘both‘

      URLField(CharField):

        字符串类型,Django Admin以及ModelForm中提供验证支持字母 数字 下划线 连接符(减号)

      CommaSeparatedIntegerField(CharField):

        - 字符串类型,格式必须为逗号分割线的数字

      UUIDField(Field):

        - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

      FilePathField(Field):

        - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能

        - 参数:

          path         文件夹路径

          match=None      正则匹配

          recursive=False    递归下面的文件夹

          allow_files=True      允许文件

          allow_folders=False   允许文件夹

      FileField(Field):

        - 字符串,路径保存在数据库,文件上传到指定目录

        - 参数:

          upload_to = " "  上传文件的保存路径

          storage = None  存储组件,默认 django.core.files.storage.FileSystemStorage

      ImageField(FileField):

        - 字符串.路径保存在数据库,文件上传到指定目录

        - 参数:

          upload_to = ""  上传文件的保存路径

          storage = None  存储组件,默认 django.core.files.storage.FileSystemStorage

          width_field = None  上传图片的高度保存的数据库字段名(字符串)

          height_field=None  上传图片的宽度保存的数据库字段名(字符串)

      TimeField(DateTimeField):

        - 时间格式  HH:MM[:ss[:uuuuuu]]

      DurationField(Field):

        - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timefelta类型

      FloatField(Field):

        - 浮点型

      DecimalField(Field):

        - 10进制小数

        - 参数:

          max_digits,小数总长度

          decimal_places,小数位长度

      BinaryField(Field):

        - 二进制类型

    自定义字段

      自定义一个二进制字段,以及django字段与数据库字段类型的对应关系.

 1 class UnsignedIntegerField(models.IntegerField):
 2     
 3     def db_type(self, connection):
 4         
 5         return integer UNSIGNED
 6 
 7 # PS: 返回值为字段在数据库中的属性
 8 # Django字段与数据库字段类型对应关系如下:
 9     AutoField: integer AUTO_INCREMENT,
10     BigAutoField: bigint AUTO_INCREMENT,
11     BinaryField: longblob,
12     BooleanField: bool,
13     CharField: varchar(%(max_length)s),
14     CommaSeparatedIntegerField: varchar(%(max_length)s),
15     DateField: date,
16     DateTimeField: datetime,
17     DecimalField: numeric(%(max_digits)s, %(decimal_places)s),
18     DurationField: bigint,
19     FileField: varchar(%(max_length)s),
20     FilePathField: varchar(%(max_length)s),
21     FloatField: double precision,
22     IntegerField: integer,
23     BigIntegerField: bigint,
24     IPAddressField: char(15),
25     GenericIPAddressField: char(39),
26     NullBooleanField: bool,
27     OneToOneField: integer,
28     PositiveIntegerField: integer UNSIGNED,
29     PositiveSmallIntegerField: smallint UNSIGNED,
30     SlugField: varchar(%(max_length)s),
31     SmallIntegerField: smallint,
32     TextField: longtext,
33     TimeField: time,
34     UUIDField: char(32),

  

      自定义一个char类型字段:

 1 class MyCharField(models.Field):
 2     """
 3     自定义的char类型的字段类
 4     """
 5     def __init__(self, max_length, *args, **kwargs):
 6         self.max_length = max_length
 7         super(MyCharField, self).__init__(max_length = max_length, *args, **kwargs)
 8 
 9     def db_type(self, connection):
10     """
11     限定生成数据库表的字段类型为char,长度为max_length指定的值
12     """
13     return char(%s) % self.max_length

 

        

      使用自定义char类型字段:

1 class Class(models.Model):
2     id = models.AutoField(primary_key=True)
3     title = models.CharField(max_length=25)
4     # 使用自己定义的char类型的字段
5     cname = MyCharField(max_length=25)

 

      表结构:


技术分享图片

 

      字段参数

 1 null                数据库中字段是否可以为空
 2 db_column           数据库中字段的列名
 3 default             数据库中字段的默认值
 4 primary_key         数据库中字段是否为主键
 5 db_index            数据库中字段是否可以建立索引
 6 unique              数据库中字段是否可以建立唯一索引
 7 unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
 8 unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
 9 unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
10 
11 verbose_name        Admin中显示的字段名称
12 blank               Admin中是否允许用户输入为空
13 editable            Admin中是否可以编辑
14 help_text           Admin中该字段的提示信息
15 choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
16     如:gf = models.IntegerField(choices=[(0, 何穗),(1, 大表姐),],default=1)
17 
18 error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
19     字典健:null, blank, invalid, invalid_choice, unique, and unique
20     如:{null: "不能为空.", invalid: 格式错误}
21 
22 validators          自定义错误验证(列表类型),从而定制想要的验证规则;
23     from django.core.validators import RegexValidator
24     from django.core.validators import EmailValidator,URLValidator,DecimalValidator,MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
25     如:
26     test = models.CharField(
27 
28                             max_length=32,
29 
30                             error_messages={
31 
32                                 c1: 优先错信息1,
33 
34                                 c2: 优先错信息2,
35 
36                                 c3: 优先错信息3,
37 
38                             },
39 
40                             validators=[
41 
42                                 RegexValidator(regex=root_d+, message=错误了, code=c1),
43 
44                                 RegexValidator(regex=root_112233d+, message=又错误了, code=c2),
45 
46                                 EmailValidator(message=又错误了, code=c3), ]
47 
48                             )

 

        

 

以上是关于Django之ORM操作的主要内容,如果未能解决你的问题,请参考以下文章

Django之ORM

Django 基础 之ORM简介与单表操作

九Django之ORM

Django之ORM框架的使用

django之ORM数据库操作

Django学习第5篇:Django之ORM数据库操作