• 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'))
    

      

  • 相关阅读:
    点云处理算法核心-八叉树
    点云平台之cloudCompare开发三
    点云法向量估计方法
    PCL源码编译
    PCL裁剪之多边形裁剪
    点云平台PCLvisualization多边形裁剪方法初探
    点云合并pcl重载“+”
    点云平台之CloudCompare开发二
    点云平台之QtitanRibbon
    神舟电脑 战神ZX6-CT5A2 键盘失灵
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/11757582.html
Copyright © 2020-2023  润新知