一、建立数据库模型类
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"是否超温")
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) )
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