• Django---数据库ORM


    一、建立数据库模型类

      1.在model里创建模型类。(继承models.Model)---实例化对象

    1 class Order(models.Model):
     2     TYPE_CHOICE = (
     3         (0, u"普通运单"),
     4         (1, u"绑定关系"),
     5         (2, u"库房读取")
     6     )
     7     mac = models.CharField(max_length=TEXT_LEN, blank=True)
     8     device = models.ForeignKey(IotDevice, related_name='device_orders', blank=True, null=True)#外键
     9     operation = models.SmallIntegerField(choices=TYPE_CHOICE, null=True, blank=True)#存贮信息对应的关系
    10     is_abnormal = models.BooleanField(default=0, verbose_name=u"是否超温")
    View Code

          2.模型里数据可用字段类型

    类型 说明
    AutoField 自动增长的IntegerFieId, 通常不用指定, 不指定时Djang 。会自动创建属性名为id 的
    自动增长属性
    BooleanField 布尔字段, 值为True 或FaIse
    NullBooleanField 支持N 、True 、FaIse 三种值
    CharField 字符串, 参数maxlength 表示最大字符个数
    TextField 大文本字段, 一般超过4000 个字符时使用
    lntegerFieId 整数
    DecimalField 十进制浮点数, 参数max-digits 表示总位数, 参数decimal-places 表示小数位数
    FloatField 浮点数
    DateField 日期, 参数auto_now 表示每次保存对象时, 自动设置该字段为当前时间, 用于" 最
    后一次修改" 的时间戳, 它总是使用当前日期, 默认为FaIse; 参数auto_now_add
    表示当对象第一次被创建时自动设置当前时间, 用于创建的时间戳, 它总是使用当
    前日期, 默认为FaIse; 参数auto_now_add 和auto_now 是相互排斥的, 组合将会发
    生错误
    TimeField 时间, 参数同DateField
    DateTimeField 日期时间, 参数同DateField
    FileField

    上传文件字段 

    lmageFieId 继承于FileField
    , 对上传的内容进行校验, 确保是有效的图片

           3.字段

    选项 说明
    null True:表示允许为空,默认值为False 
    blank True:表示该字段允许为空白,默认False
    db_column   字段的名称未指定,默认使用属性的名称
    db_index 若值为True,则在表中为此字段创建索引,默认值为False
    default   默认
    primary_key  若为True,该字段则为模型类的主键,默认值:False,一般作为AutoField的选项使用

    unique   

    若为True,这个字段在表中必须为唯一值,默认False

          4.外键设置

      在设置外键时,通过on_delete选项指明主表删除数据时,对于外键引用副表的相关数据如何处理,在django.db.models中包含可选常量:

    • CASCADE 级联,删除主表数据时,连同一起删除副表关联数据。
    • PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据。
    • DO_NOTHING 不做任何操作,如果数据库前置指明级联性,此选项抛出IntegrityError异常
    • SET_NULL 设置为NULL,仅在该字段null=True允许为null时使用。
    • SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用。
    • SET() 设置为特定值或特定使用方法,如
    from django.conf import settings
    from django.contrib.auth import get_user_model
    from django.db import models
    
    def get_sentinel_user():
        return get_user_model().objects.get_or_create(username='delete')[0]
    
    class MyModel(models.Model):
        user = models.ForeignKey(
                settings.AUTH_USER_MODEL,
                on_delete=models.SET(get_sentinel_user)   
    )    
    View Code

          5.将实例化对象同步到数据库

      python manage.py makemigration------->生成迁移文件

      python manage.py migrate---------->迁移文件

    二、ORM---curd

      数据的增加:

    1 list=[]
    2  for i in temp:
    3      list.append(IotTemp(time=_time,temp=_temp))
    4 
    5 #批量添加
    6 IotTemp.objects.bulk_create(list)
    第三种-----批量添加
    1 HeroInfo.objects.create(
    2          name='唐僧',
    3          gengder='0',
    4          book=book )
    第二种
    book=Book(
          btitle='西游记',
          bput_data=date(1988,1,1),
          bread=10,
          bcomment=10      
    )
    book.save()
    第一种

          数据的删除:

    1 hero=HeroInfo.objects.get(id=3)
    2 her0.delete()
    第一种
    1 HeroInfo.objecs.filter(id=4).delete()
    第二种

          数据的修改:

    1 hero=HeroInfo.objects.get(name='唐僧')
    2 hero.name='唐玄奘'
    3 hero.save()
    第一种
    1 HeroInfo.objects.filter(name='唐僧').update(name='唐玄奘')
    第二种

          数据的查询:

      1.基本查询:

       book=BookInfo.objects.get(btitle='西游记')              #单一查询,结果不存在报错

       book=BookInfo.objects.all()                      #查询全部,不存在返回None

       book=BookInfo.objects.count(name__contains=''西)            #查询结果的数量

       book=BookInfo.objects.exclude(btitle='西游记')            #查询结果取反

      2.模糊查询:

       contains---->包含

         book=BookInfo.objects.filter(btitle__contains='游')           #查询btitle字段中带有“游”字的对象

       startswith,endswith---->以什么开头或结尾

         book=BookInfo.objects.filter(btitle__startswith='游')            #查询btitle字段中以“游”字开头的对象

         book=BookInfo.objects.filter(btitle__endswith='游')             #查询btitle字段中以“游”字结束的对象

       istartswith / iendswith---->以....开头/结尾,忽略大小写          ##

          注意:这里的下划线为英文格式下的双下划线,之后的介绍都是

      3.空查询:

       is null / is not null---->是否为空

         book=BookInfo.objects.filter(btitle__isnull=False)            #查询btitle字段不为空的对象

         book=BookInfo.objects.filter(btitle__isnull=True)             #查询btitle字段为空的对象

      4.范围查询:

       in---->在范围内

       range---->参考between...and...

         book=BookInfo.objects.filter(id__in=[1,3,5,7])               #查询id为1,3,5,7的对象

         book=BookInfo.objects.filter(id__range=[1,7])               #查询id范围在1-7之间的对象

      5.比较查询:

        gt-----------------大于

        gte---------------大于等于

        lt------------------小于

        lte----------------小于等于

        exclude---------不等于/不包含于

          book=BookInfo.objects.filter(id__gt=10)                  #查询id大于10的对象

          book=BookInfo.objects.exclude(id=10)                                                        #查询id不为10的对象

                  book=BookInfo.objects.exclude(id__in=[1,5])               #查询id不在1-5之间的对象

      6.日期查询:

        year,month,day,week_day,hour,minute,second:对日期时间类型的属性进行运算。

          book=BookInfo.objects.filter(bpub_date__year=1977)             #查询1977年出版的书

          book=BookInfo.objects.filter(bpub_date__gt=date(1977,1,1))       #查询1977年1月1号以后出版的书

      7.F对象与Q对象

        比较两个字段对象之间的关系用  F对象    (F对象可以进行运算)

          book=BookInfo.objects.filter(bread__gte=F('bcomment'))        #查询阅读量等于评论量的对象

          book=BookInfo.objects.filter(bread__gte=F('bcomment')*2)       #查询阅读量为评论量二倍的对象

        与逻辑运算符连用使用Q对象     或--> '|'    与--> '&'   非--> '~'

          book=BookInfo.objects.filter(Q(bread__gte=20)|Q(pk__lt=3))          #查询阅读量大于等于20或id为3的对象

      8.聚合函数

        使用aggregate()过滤器调用聚合函数----->包含:Avg  平均,Count  数量,Max  最大,Min  最小,Sum  求和

          book=BookInfo.objects.aggregate(Sum('bread'))                   #求阅读量的和

      9.排序

        使用order_by对结果进行排序

          book=BookInfo.objects.all().order_by('bread')             #对查询结果按阅读量升序排列(默认)

          book=BookInfo.objects.all().order_by('-bread')               #对查询结果按阅读量降序排列

      10.关联查询

        一对多模型

        一到多的访问语法:  一对应的模型类对象.多对应的模型类名小写_set

          b=BookInfo.objects.filter(id=1)    

          b.heroinfo_set.all()                       #查询Book的id=1的书里的所有英雄

        多到一的访问语法: 多对应的模型类对象.多对应的模型类中关系类属性名(外键)

          h=HeroInfo.objects.filter(id=1)

          h.hbook                         #查询id=1的英雄所对应的书籍

      11.like:

        __exact          精确等于

        __iexact         精确等于忽略大小写

        __contains     包含

        __icintains     包含,忽略大小写------》对于sqlite来说,contains效果等同于icontains

  • 相关阅读:
    常用 Git 命令清单
    radhat 6.4/centos 6.4 下编译安装 最新ruby 2.1.5
    centos 6.4/redhat 6.4 安装gitlab
    微信小程序——navigator无法跳转
    微信小程序——修改data里面数组某一个值
    微信小程序——template的循环嵌套
    微信小程序——template的使用方法
    node学习笔记8——发布npm包
    淘宝镜像使用方法
    node学习笔记7——npm安装包
  • 原文地址:https://www.cnblogs.com/little-sailor/p/12731685.html
Copyright © 2020-2023  润新知