• Django ORM整理


    字段类型

       # 自增长
        Auto = models.AutoField()
        BigAuto = models.BigAutoField()
        
        # 二进制
        Binary = models.BinaryField()
        
        # 布尔型 
        Boolean = models.BooleanField()
        NullBoolean = models.NullBooleanField()
        
        # 整型
        PositiveSmallInteger = models.PositiveSmallIntegerField()   #正整数 5个字节
        SmallInteger = models.SmallIntegerField()   # 整数 6个字节
        PositiveInteger = models.PositiveIntegerField()     # 正整数 10个字节
        Integer = models.IntegerField()     # 整数 11个字节
        BigInteger = models.BigIntegerField()   # 整数 20个字节
    
        # 浮点型
        Float = models.FloatField()
        Decimal = models.DecimalField()   # 指定总位数和小数位数
    
        # 字符串
        Char = models.CharField()   # 指定最大长度 数据库对应varchar
        Text = models.TextField()    # 不限长度  数据库对应longtext
    
        # 时间日期类型
        Date = models.DateField()
        DateTime = models.DateTimeField(
        Duration = models.DurationField()     # 持续时间,数据表中为int,python中timedelta实现
    
        # 其他字段
        Email = models.EmailField()
        Image = models.ImageField()
        File = models.FileField()
        FilePath = models.FilePathField()
        URL = models.URLField()
        UUID = models.UUIDField()
        GenericIPAddress = models.GenericIPAddressField()    # IPv4或者IPv6
    

    字段参数

        # 共有参数
        db_column      #字段名
        primary_key    #是否为主键
        verbose_name    #别名
        unique    #是否添加唯一约束
        help_text    #帮助信息
        editable   #是否可编辑
        null    #数据库是否可为空
        blank    #表单中是否可为空
        db_index   #是否添加索引
    
        # 特殊参数
        Decimal = models.DecimalField(max_digits=4, decimal_places=2)    # 总共4位,其中小数点2位  11.22   16.14
        Date = models.DateField(unique_for_date=True, auto_now=True)    # 日期唯一  自动更新修改日期
        DateTime = models.DateTimeField(unique_for_month=True, auto_now_add=True)    # 月份唯一 自动更新添加日期
        Char = models.CharField(max_length=100)    # 最大长度
    
        # 关系参数
        one2one = models.OneToOneField(Test, related_name='one')    # related_name 用于反向查询
        """on_delete 当一个被外键关联的对象被删除时,Django将模仿on_delete参数定义的SQL约束执行相应的操作
            如下6种操作
            CASCADE: 模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除(该操作为当前版本Django-1.11默认操作)
            PROTECT: 阻止上面的删除操作,但是弹出ProtectedError异常
            SET_NULL: 将外键字段设为null,只有当字段设置了null=True时,方可使用
            SET_DEFAULT: 将外键字段设为默认值,只有当字段设置了default参数时,方可使用
            DO_NOTHING: 什么也不做
            SET(): 设置为一个传递给SET()的值或者一个回调函数的返回值,注意大小写
        """
        foreign1 = models.ForeignKey(A, on_delete=models.CASCADE)  
        foreign2 = models.ForeignKey(A, on_delete=models.PROTECT)    
        foreign3 = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True)  
        foreign4 = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0)
        foreign5 = models.ForeignKey(A, on_delete=models.DO_NOTHING)
        foreign6 = models.ForeignKey(A, on_delete=models.SET)
    

    元数据

        # Model类中自带一个Meta子类用于定义模型元数据,元数据主要对数据表进行定义
        db_table = 'address'    # 表名称
        ordering = ['pid']    # 排序
        verbose_name = '省市县地址信息'    # 数据表别名
        verbose_name_plural = verbose_name    # 复数别名
        abstract = True    # 只用于继承而不生成数据表
        permissions = (('定义好的权限', '权限说明'),)    
            class Task(models.Model):
                class Meta:
                #自定义权限
                    permissions = (
                        ("view_task", "Can see available tasks"),
                        ("change_task_status", "Can change the status of tasks"),
                        ("close_task", "Can remove a task by setting its status as closed"),
                    )
            #用户检查自定义权限
            user.has_perm('app.view_task')
        managed = False    # 是否纳入管理,False则不会生成表
        unique_together = ('address', 'note')         # 联合唯一键
        app_label = 'courses'     # INSTALLED_APPS中如果没有添加courses应用,这里需要指定
        db_tablespace     # 定义数据库表空间的名字
    

    查询接口

    Teacher.objects.all()
    Teacher.objects.get(nickname='Jack')
    Teacher.objects.filter(fans__gte=500)
    Teacher.objects.filter(fans__in=[666,123])   # 在列表内
    Teacher.objects.filter(nickname__icontains='A')  icontains # 大小写不敏感
    Teacher.objects.all()[:1]    # 切片
    Teacher.objects.all().order_by('-fans')    # 排序  
    Teacher.objects.filter(fans__gte=500).order_by('nickname')    # 链式查询
    str(Teacher.objects.filter(fans__gte=500).order_by('nickname').query)    # 查看原生SQL
    Student.objects.all().exclude(nickname='A同学')  # 排除
    Student.objects.all().reverse()  反向排序   # models的Meta中需要添加ordering
    Student.objects.all().distinct() # 去重
    Student.objects.all().extra(select={'name': 'nickname'})  # 取别名
    Student.objects.all().defer()   # 排除某些字段
    Student.objects.all().only()    # 只获取某些字段
    Student.objects.all().values('nickname', 'hobby')    # 获取字典形式的QuerySet  分组
    Student.objects.all().values_list('nickname', 'hobby')    # 获取元组形式的QuerySet   分组
    Student.objects.all().values_list('nickname', flat=True)  # 当只有一个字段时,flat=True可以将元组中的值直接放入列表中
    Student.objects.dates('created_at', 'month', order='DESC') # 根据时期获取查询集
    Student.objects.datetimes('created_at', 'month', order='DESC') # 根据时期获取查询集
    p_240 = Course.objects.filter(price__gte=240)
    p_260 = Course.objects.filter(price__lte=260)
    p_240.union(p_260)     # 并集      innodb只支持并集
    p_240.intersection(p_260) #  交集
    p_240.difference(p_260)    #  差集
    courses = Course.objects.all().select_related('teacher')  # 一对一 多对一查询优化
    students = Student.objects.all().prefetch_related('course')  # 一对多 多对多查询优化  
    Teacher.objects.get(nick='Jack').course_set.all()   # 反向查询
    
    Course.objects.values('teacher').annotate(vol=Sum('volume'))  # 聚合计数
    Course.objects.values('teacher').annotate(pri=Avg('price'))  # 聚合计数
    
    get_or_create()
    Course.objects.first()
    Course.objects.last()
    Course.objects.earliest()   # Meta中添加get_latest_by
    Course.objects.latest()     # Meta中添加get_latest_by
    Course.objects.in_bulk(['课程1', '课程2'])
    
    create()
    bulk_create()
    update_or_create()
    
    update()
    Course.objects.filter(title='test').delete()
    
    Course.objects.filter(title='test').exists()
    Course.objects.count()
    Course.objects.aggregate(Max('price'),Min('price'), Avg('price'), Sum('volume'))
    
    #F对象和Q对象
    #F对象:操作字段的数据
    Course.objects.update(price=F('price') - 11)
    Course.objects.filter(volume__lte=F('price')*10)
    
    #Q对象:结合AND,OR,NOT,|,~,&实现复杂的查询
    Course.objects.filter(Q(title__icontains='java') & Q(volume__gte=5000))
    
  • 相关阅读:
    mysql安装前的系统准备工作(转)
    mysql多实例的配置(转)
    饼干怪兽和APT攻击
    Linux
    android application简要类(一)
    轨道sql谈话 dbms_monitor
    Android有关Volley使用(十)至Request和Reponse意识
    data URI scheme及其应用
    java在string和int相互转化
    ComponentName意思
  • 原文地址:https://www.cnblogs.com/Peter2014/p/11627019.html
Copyright © 2020-2023  润新知