zoukankan      html  css  js  c++  java
  • day63 django--ORM

    一,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)
    自定义char类型字段

    四,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
  • 相关阅读:
    Java内存模型原理,你真的理解吗?
    CentOS 7.4 下搭建 Elasticsearch 6.3 搜索群集
    CentOS 7下ElasticSearch集群搭建案例
    分布式系统理论基础
    分布式系统理论进阶
    Paxos,Raft,Zab一致性协议-Raft篇
    P2P 网络核心技术:Gossip 协议
    分布式系统Paxos算法
    Hacker News的热门排名算法(转)
    Elasticsearch分布式机制和document分析
  • 原文地址:https://www.cnblogs.com/lianyeah/p/9932350.html
Copyright © 2011-2022 走看看