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

Django框架

Django Model 进阶

Django进阶

Java进阶之光!2021必看-Java高级面试题总结

django进阶

Django-models进阶