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

原文地址:https://www.cnblogs.com/little-sailor/p/12731685.html