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操作的主要内容,如果未能解决你的问题,请参考以下文章