一,ORM常用字段
#AutoField: int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。 #IntegerField 一个整数类型,范围在 -2147483648 to 2147483647。 #CharField 字符类型,必须提供max_length参数, max_length表示字符长度 #DateField 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例 #DateTimeField 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
二,字段合集(争取记忆)
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 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中提供验证 URL SlugField(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 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型
三,自定义字段
class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return 'integer UNSIGNED'
class FixedCharField(models.Field): """ 自定义的char类型的字段类 """ def __init__(self, max_length, *args, **kwargs): super().__init__(max_length=max_length, *args, **kwargs) self.length = max_length def db_type(self, connection): """ 限定生成数据库表的字段类型为char,长度为length指定的值 """ return 'char(%s)' % self.length class Class(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=25) # 使用上面自定义的char类型的字段 cname = FixedCharField(max_length=25)
四,ORM字段与数据库实际字段的对应关系
对应关系: 'AutoField': 'integer AUTO_INCREMENT', 'BigAutoField': 'bigint AUTO_INCREMENT', 'BinaryField': 'longblob', 'BooleanField': 'bool', 'CharField': 'varchar(%(max_length)s)', 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)', 'DateField': 'date', 'DateTimeField': 'datetime', 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)', 'DurationField': 'bigint', 'FileField': 'varchar(%(max_length)s)', 'FilePathField': 'varchar(%(max_length)s)', 'FloatField': 'double precision', 'IntegerField': 'integer', 'BigIntegerField': 'bigint', 'IPAddressField': 'char(15)', 'GenericIPAddressField': 'char(39)', 'NullBooleanField': 'bool', 'OneToOneField': 'integer', 'PositiveIntegerField': 'integer UNSIGNED', 'PositiveSmallIntegerField': 'smallint UNSIGNED', 'SlugField': 'varchar(%(max_length)s)', 'SmallIntegerField': 'smallint', 'TextField': 'longtext', 'TimeField': 'time', 'UUIDField': 'char(32)',
五,ORM常用字段的参数
null 数据库中字段是否可以为空 db_column 数据库中字段的列名 default 数据库中字段的默认值 primary_key 数据库中字段是否为主键 db_index 数据库中字段是否可以建立索引 unique 数据库中字段是否可以建立唯一索引 unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引 unique_for_month 数据库中字段【月】部分是否可以建立唯一索引 unique_for_year 数据库中字段【年】部分是否可以建立唯一索引 null=True 可以为空 default='xx' 默认值 unique=True 唯一约束 DatetimeField、TimeField和Datefield独有: auto_now_add=True --> 创建数据记录的时候会把当前时间添加到数据库 auto_now=True --> 每次更新数据记录的时候会更新该字段
choice参数的字段
obj.get_字段_display() 获取choice字段的显示值
六,建表的元信息
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息
#主要字段如下: db_table #ORM在数据库中的表名默认是app_类名,可以通过db_table重写表名 index_together #联合索引 unique_together #联合唯一索引 ording #指定默认按什么字段排序,只有设置了该属性,查询到的结果才可以被reverse()
实例:
class Meta: db_table = '表名' 控制建表的表名 unique_together = (('ip','port')) 联合唯一索引 index_together = (('pub_date','deadline')) 联合索引
#元信息--联合唯一 class Site(models.Model): ip = models.GenericIPAddressField() port = models.IntegerField() class Meta: unique_together=(('ip','port')) #元信息--联合索引 class Site(models.Model): ip = models.GenericIPAddressField() port = models.IntegerField() class Meta: index_together=(('ip','port'))
七,必知必会13条class.objects.方法
1.返回QuerySet列表类型的 1.filter() 2.all() 3.exclude() 4.orday_by('字段') 根据xx排序,返回的是列表,列表中是对象 order_by('-字段') 根据xx排序(反序),返回的是列表,列表中是对象 5.reverse() 从结果中反序 6.distinct() 从结果中剔除重复记录 7.values('字段') 返回的是列表,列表中不是对象而是字典 8.values_list() 返回的是列表,列表中不是对象而是元组 2.返回具体对象的 1.get() 2.firest() 返回第一个对象 3.last() 返回最后一个对象 3.返回布尔值 1.exists() 判断表是否有数据,返回布尔值 4.返回数字的 1.count() 从结果中统计数量
八,单表查询的双下划线(支持链式操作)
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的 models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and 类似的还有:startswith,istartswith, endswith, iendswith date字段还可以: models.Class.objects.filter(first_day__year=2017)
1.filter(id__lt=3) --> id<3 2.filter(id__lte=3) --> id<=3 3.filter(id__gt=3) --> id>3 4.filter(id__gte=3) --> id>=3 5.filter(id__in=[1,3,5]) --> id=1、3、5 6.filter(name__contains='sb') --> name里面有sb的 7.filter(name__icontains='sb') --> 忽略大小写,name里面有sb的 8.filter(name__endswith='sb') --> name里面已sb结尾的,加i忽略大小写 9.filter(birthday__month=11) --> 出生是11月的
九,补充
#settings.py中的配置
USE_TZ = False 是否使用时区 #在一个python文件查询数据库 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE","about_orm.settings") import django django.setup() from app01.models import UserInfo