zoukankan      html  css  js  c++  java
  • Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    一丶ORM常用字段和自定义字段

    常用字段

     AutoField  # 主键  自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动创建。 一个model不能有两个AutoField字段。
     
    CharField  # 字符串	字符类型,必须提供max_length参数。max_length表示字符的长度。
    
    TextField  # 大字符串
    
    IntegerField  # 整形   一个整数类型。数值的范围是 -2147483648 ~ 2147483647。
    
    DateTimeField   DateField   # 日期 日期时间
    						auto_now:每次修改时修改为当前日期时间。
    						auto_now_add:新创建对象时自动添加当前日期时间。
    						auto_now和auto_now_add和default参数是互斥的,不能同时设置。
    
    BooleanField  # 布尔
    
    DecimalField  max_digits=5  decimal_places=2  #一共5位,小数点2位,最大值为:999.99
    

    所有字段

        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'  # UNSIGNED 表示从正整数开始,integer是int类型
                    
    
                    
    # 自定义char类型
    	class MyCharField(models.Field):
            """
            自定义的char类型的字段类
            """
            def __init__(self, max_length, *args, **kwargs): # max_length指定字符串宽度
                self.max_length = max_length
                super(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)
    
            def db_type(self, connection):
                """
                限定生成数据库表的字段类型为char,长度为max_length指定的值
                """
                return 'char(%s)' % self.max_length  # 返回 'char(32)' 在数据库中就是char类型宽度32  
     # char类型字段的使用       
     class Class(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=25)
        # 使用自定义的char类型的字段
        cname = MyCharField(max_length=25)
    

    Django字段与数据库字段类型对应

    # PS: 返回值为字段在数据库中的属性。
    # Django字段与数据库字段类型对应关系如下:
        '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)',
    

    二丶字段参数和Meta的参数

    字段的参数

    ​ 对字段的约束

    Django的字段参数的详解

    null                数据库中字段是否可以为空
    
    db_column           数据库中字段的列名
    
    default             数据库中字段的默认值
    
    primary_key         数据库中字段是否为主键
    
    db_index            数据库中字段是否可以建立索引
    
    unique              数据库中字段是否可以建立唯一索引
    
    unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
    
    unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
    
    unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    
    verbose_name        Admin中显示的字段名称
    
    blank               Admin中是否允许用户输入为空 ,  # blank表单校验约束为空
    
    editable            Admin中是否可以编辑
    
    help_text           Admin中该字段的提示信息
    
    choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                       如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    
    auto_now		   日期类型的参数 , auto_now 修改就更新这个字段的时间
    
    auto_now_add		日期类型的参数 , 只记录第一创建的时间
        
    error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
    				  字典键:null, blank, invalid, invalid_choice, unique, and unique_for_date
                        如:{'null': "不能为空.", 'invalid': '格式错误'}
     
    validators          自定义错误验证(列表类型),从而定制想要的验证规则
    	from django.core.validators import RegexValidator
    	from django.core.validators import EmailValidator,URLValidator,DecimalValidator,         MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
    
    ### validators用法:
    	 test = models.CharField(
          	max_length=32,
          	error_messages={
          	    'c1': '优先错信息1',
          	    'c2': '优先错信息2',
          	    'c3': '优先错信息3',
          	},
          	validators=[
          	    RegexValidator(regex='root_d+', message='错误了', code='c1'),
                RegexValidator(regex='root_112233d+', message='又错误了', code='c2'),
                EmailValidator(message='又错误了', code='c3'), ]
             )
    

    Meta的参数

       对表的属性修改:修改表名

    Django的Meta字段参数的详解

    class UserInfo(models.Model):
        nid = models.AutoField(primary_key=True)
        username = models.CharField(max_length=32)
     
        class Meta:
            # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
            db_table = "table_name"
     
            # admin中显示的表名称
            verbose_name = '个人信息'	
     
            # verbose_name加s
            verbose_name_plural = '所有用户信息'
     
            # 联合索引 
            index_together = [
                ("pub_date", "deadline"),   # 应为两个存在的字段
                						  # 联合索引指的是表上的多个列合并起来做一个索引
            ]
     
            # 联合唯一索引
            unique_together = (("driver", "restaurant"),)   # 应为两个存在的字段
    

    三丶Django的admin操作

    ​   由Django提供的默认后台管理

    # 创建超级用户 ,user:root , password:xxx123456
     cmd 执行 : python manage.py createsuperuser
            
    # 登录
    http://127.0.0.1/admin
    
        
    # 更改成中文
    	settings.py文件修改:
        	# LANGUAGE_CODE = 'en-us'
    		LANGUAGE_CODE = 'zh-Hans'
            
    # 进行CURD增删改查
    

    四丶13中ORM操作方法

    # -*-coding:utf-8-*-
    # Author:Ds
    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORMSQLTestDemo.settings")  #导入 Django的环境
    import django 	# 导入Django
    	
    django.setup()  # 设置Django
    
    
    # 导入 models.py文件,能使用orm操作对表可以进行操作
    from app02 import models
    
    ###   得到的是QuerySet
        # all()         查询所有
    	ret=models.User.objects.all()
    
        #filter()       满足条件
    	ret=models.User.objects.filter()
    
        #exclude()     不满足条件
    	ret=models.User.objects.exclude()
    
        # order_by('字段')   排序
    	ret=models.User.objects.all().order_by('name')
    
        # reverse()  对一个排序的QuerySet 进行翻转
    	ret=models.User.objects.all().order_by('name').reverse()
    
        # values() 获取对象的字段名 和 值  , 若是没有参数则是查询所有字段
    	ret=models.User.objects.values('name','age') # 执行str方法
    
        # values_list() # 获取对象的字段值 ,没有参数则获取全部的字段值
    	ret=models.User.objects.values_list('name','age') # 执行str方法
    
        #  distinct  去重
    	ret=models.User.objects.values('age').distinct()
    
    
    ### 得到对象
        # get()  根据条件得到一个符合条件的对象
        ret=models.User.objects.get(pk=1)
    
        # first()  得到表中的第一个对象
        ret=models.User.objects.first()
    
        # last()  得到表中的最后一个对象
        ret=models.User.objects.last()
    
    
    ###   count() 得到查询的个数  得到一个数字
    	ret=models.User.objects.all().count()
    
    ### exists() 判断是否存在 得到一个布尔值
    	ret=models.User.objects.filter(pk=1).exists()
    

    五丶单表的双下划线

       单标的双下划线方法,是用于更具体的筛选

    # -*-coding:utf-8-*-
    # Author:Ds
    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORMSQLTestDemo.settings")
    import django
    
    django.setup()
    from app02 import models
    
    ###PS:  单标的双下方法 是用于更具体进行过滤筛选
    # greather than  大于
    ret=models.User.objects.filter(pk__gt=1)
    
    # greather than   equal  大于等于
    ret=models.User.objects.filter(pk__gte=1)
    
    # less than 小于
    ret=models.User.objects.filter(pk__lt=1)
    
    # less  than equal 小于等于
    ret=models.User.objects.filter(pk__lte=1)
    
    # 范围 __range=(1,5) 范围:1到5之间,包含1和5
    ret=models.User.objects.filter(pk__range=(1,5))
    
    # 范围 __in=[1,2,3]  # 在给定的列表出现
    ret=models.User.objects.filter(pk__in=[1,2,3])
    
    # 包含 __contains=''  , 如 XX like %zz%
    ret=models.User.objects.filter(name__contains='abc')
    
    # 忽略大小写  __icontains=''  , 如 XX like %zz%  i: ignore忽略
    ret=models.User.objects.filter(name__icontains='abc')
    
    # __startwith='a' 以a开头
    ret=models.User.objects.filter(name__startswith='a')
    # __istartwith='a' 以a开头 ,忽略大小写   i: ignore忽略
    ret=models.User.objects.filter(name__istartswith='a')
    
    #  __endswith='a' 以a结尾
    ret=models.User.objects.filter(name__endswith='a')
    
    # __iendswith='a' 以a开头 ,忽略大小写   i: ignore忽略
    ret=models.User.objects.filter(name__endswith='a')
    
    
    #日期包含,仅年是可以匹配出来
    ret=models.User.objects.filter(birth__year='2010')
    
    # 月份和日期 使用字符串包含.也可查询
    ret=models.User.objects.filter(birth__contains='2010-09')
    
    # 是否为空
    ret=models.User.objects.filter(age__isnull=True)
    
    
  • 相关阅读:
    利用DTrace实时检测MySQl
    改进MySQL Order By Rand()的低效率
    RDS for MySQL查询缓存 (Query Cache) 的设置和使用
    RDS For MySQL 字符集相关说明
    RDS for MySQL 通过 mysqlbinlog 查看 binlog 乱码
    RDS for MySQL Mysqldump 常见问题和处理
    RDS for MySQL Online DDL 使用
    RDS MySQL 表上 Metadata lock 的产生和处理
    RDS for MySQL 如何使用 Percona Toolkit
    北京已成为投融资诈骗重灾区:存好骗子公司黑名单,谨防上当!
  • 原文地址:https://www.cnblogs.com/dengz/p/11462441.html
Copyright © 2011-2022 走看看