django model 高级进阶
Posted sunshinekimi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django model 高级进阶相关的知识,希望对你有一定的参考价值。
十.model高级用法: 10.1 ORM映射: Object Relational Mapping: orm映射的任务: 将list ,object 的操作转化为sql语句,根据对象生成数据表,将查询对象转换为对象和数据list 减少代码,重构,不需要因为数据库结构变化修改业务代码 模型类对应对应一张表,属性对应模型对应该模型对照表的对应的字段 10.2字段:Field高级用法: AutoField一个自增整数类型字段,一个模型对照表只允许一个主键且自增字段必须为主键pk BigAutoField(1.10新增)64位整数类型自增字段,范围更大:1~9223372036854775807 IntegerField 整数类型范围:-2147483648~2147483647 SmallIntegerField小整数,包含[-32768~32767] BigIntegerField(64位整数字段):范围-9223372036854775808~9223372036854775807 PositiveIntegerField (正整数字段)范围:包含[0~214748364] PositiveSmallIntegerField较小的正整数字段,从0到32767 BinaryField二进制数据类型,不能使用filter函数获得QuerySet CharField字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值,即对模型和数据库层面生效又对前端生效 TextField大量文本内容,适用于前端TextArea 文本框控件:如果你为它设max_length只对前端输入字符数量限制, 不对数据库模型影响 时间字段: 1.TimeField 只作用于小时、分和秒,接收参数同DateField一样的参数HH:MM[:ss[.uuuuuu]] 2.DateFiled : DateField(auto_now=False, auto_now_add=False, **options),datetime.date的实例 3.DateTimeField日期时间类型。Python的datetime.datetime的实例,与DateField相比就是多了小H:M:S的显示 小数: DecimalField固定精度的十进制小数,接收参数: models.DecimalField(..., max_digits=5, decimal_places=2)。max_digits整数位数, FloatField浮点数类型: 必填参数:max_digits,数字长度;decimal_places,有效位数。 GenericIPAddressField(protocol=‘both‘, unpack_ipv4=False, **options)IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4 参数protocol默认值为‘both’,也可用‘IPv4’或者‘IPv6’,表示你的IP地址类型 NullBooleanField :支持null True, False BooleanField :True ,False URLField一个用于保存URL地址的字符串类型,默认最大长度200 UUIDField: 在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品 EmailField邮箱类型,默认max_length最大长度254位 SlugField:减号、下划线、字母、数字 ImageField:.height_field、width_field,提供这两个参数,则图片将按提供的高度和宽度规格保存 文件字段: FileField: FileField(upload_to=None[, max_length=100, ** options]), upload_to:一个用于保存上传文件的本地文件系统路径,该路径由 MEDIA_ROOT 中设置, 这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100 FilePathField: FilePathField(path=None[, math=None, recursive=False, max_length=100, **options]) path:文件的绝对路径,必填 match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径 recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径 字段常用参数: null=False数据库中允许此字段的值置为NULL,默认值是False blank =False,允许为空什么都不填,默认False,null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的 primary_key = False ,设置该属性为主键字段列 choices:CHIOCE_LIST=[(‘m‘,‘man),(‘f‘,woman)] choices:CHIOCE_LIST=[(‘m‘,‘man),(‘f‘,woman)] max_length default=默认值 verbose_name eignKey、ManyToManyField和OneToOneField需要通过Field.verbose_name才能自定义设置字段名 db_column="define_col_name" 数据库字段名称设置自定义别名 unique=True 表示此表该字段不允许重复 db_index = True 数据库创建索引 editable=True admin里可编辑 error_messages=None 错误提示 help_text 提示信息 validators=[] 验证器 upload-to 文件上传后保存文件的具体路径 十一.Meta元属性,以及自定义模型管理类 11.1Meta 元属性: db_table="app_grade" 表名称 ordering=["grade_id"] 查询排序规则支持多个字段进行先后顺序排列 自定义管理模型类: 第一步:继承Manager原始管理类 第二步: 重写get_queryset方法 class GradeManager(models.Manager): """重写get_queryset""" def get_queryset(self): return super(GradeManager,self).get_queryset().filter(grade_good=90) 11.2创建对象: 1.目的数据库添加数据 2.创建对象之前不会进行数据保存操作,只有在save()时才与数据库交互,将数据存储到数据库 3.创建对象的方法: a.在模型类里面创建一个创建对象的类方法实现数据创建 b.在类对应的模型管理器中创建一个实例方法管理对象: class StudentManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(k1=v1, k2=v2).order_by("column").values() class Student(models.Model): mydef_obj=GradeManager() # class.attr.func() 11.3数据查询和过滤器,排序 In [1]: from app.models import Grade In [2]: Grade.mydef_obj.all() <QuerySet [{‘grade_id‘: 1004, ‘grade_good‘: 8888, ‘grade_bad‘: 88, ‘is_delete‘: False}, {‘grade_id‘: 1003, ‘grade_good‘: 774, ‘grade_bad‘: 4444, ‘is_delete‘: False}, {‘grade_id‘: 1002, ‘grade_good‘: 90, ‘grade_bad‘: 10, ‘is_delete‘: False}, {‘grade_id‘: 1001, ‘grade_good‘: 80, ‘grade_bad‘: 60, ‘is_delete‘: False}]> Out[2]: <QuerySet [{‘grade_id‘: 1004, ‘grade_good‘: 8888, ‘grade_bad‘: 88, ‘is_delete‘: False}, {‘grade_id‘: 1003, ‘grade_good‘: 774, ‘grade_bad‘: 4444, ‘is_delete‘: False}, {‘grade_id‘: 1002, ‘grade_good‘: 90, ‘grade_bad‘: 10, ‘is_delete‘: False}, {‘grade_id‘: 1001, ‘grade_good‘: 80, ‘grade_bad‘: 60, ‘is_delete‘: False}]> 相当于where 查询字段:方法filter <==> = ,exclude <==> != ,get 等等: 用法包括: exact:精确匹配。区分大小写 Entry.objects.get(id__exact=14) Entry.objects.get(id__exact=None) iexact:不区分大小写的精确匹配 Entry.objects.filter(blog=b).delete() Entry.objects.filter(pub_date__year=2010).update(comments_on=False) exact like 区分大小写精确匹配查询相当于 = contains ,icontains 包含 也是like 效果 startswith endswith ,istartswith iendswith in lt 小于 < lte <= gt > gte >= isnull isnotnull=True __range 在…范围内 __year 日期字段的年份 __month 日期字段的月份 __day 日期字段的日 外键字段查询,比较特殊查询需要属性名称_id查询 举例: 1.Student.mydef_obj.fliter(user_name__icontains="亚索") 2.Student.mydef_obj.get(stu_id__lt=1002) 3.Grade.mydef_obj.exclude(grade_id_id=1001) #外键 F,Q对象: from django.db.models import Q F对象主要以用来比较字段A与字段B关系,Q对象用来进行或,与,非关系的判断 举例: sql: select id from tb where startTime< endTime ; F对象实现:Student.mydef_obj.filter(startTime__lt=F(‘endTime‘)) Q对象: sql: select id from tb where name=‘zh‘ and id =‘1001‘; Student.mydef_obj.filter(Q(name__exact=‘zh‘)& Q(startDate__lt=F(‘endDate‘)) Q(属性名__运算符=值) & Q(属性名__运算符=值) ==> and Q(属性名__运算符=值) | Q(属性名__运算符=值) ==> or ~Q(属性名__运算符=值) ==> not 聚合函数: 使用aggregate()过滤器调用聚合函数,聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。 from django.db.models import Sum,Avg,Count,Max,Min 举例: Grade_Info.objects.aggregate(Sum(‘server_id‘))
以上是关于django model 高级进阶的主要内容,如果未能解决你的问题,请参考以下文章