Django框架——模型(数据库操作)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架——模型(数据库操作)相关的知识,希望对你有一定的参考价值。
-- models.py
-- ORM(object-relation mapping) 实现数据模型与数据库的解耦;
# 对象,关系,映射;
1.根 据对象的类型生成表结构;
2.将对象、列表的操作,转换为sql语句;
3.将sql查询到的结果转换为对象、列表;
-- 字段类型
# 所有字段类型被定义在django.db.models.fields目录下,
# 方便使用,被导入到django.db.models中;
1.AutoField 自动增长 # 通常不用指定
2.BooleanField 布尔类型
3.NullBooleanField 支持布尔值与null
4.CharField(max_length=长度) 字符串 # 必须指定最大长度
5.TextFeild 大文本字段
6.IntegerField 整数
7.DecimalField(max_digits=None,decimal_places=None) # 浮点数,总位数,小数位数
8.DateField([auto_now=False, auto_now_add=False]) # 保存对象时间;创建对象时间;
9.TimeField 时间 # 同DateField
10.DateTimeField 日期时间 # 同DateField
11.FileField 上传文件时间
12.ImageField # 继承与FileField,对上传内容进行校验
13.BigIntegerField 64位整数
14.SmallIntegerField
-- 字段命名限制
1.非python保留字
2.不能有连续下划线,查询中有;
-- 字段选项(数据库中的约束)
1.null
2.blank
3.db_column # 自定义字段名
4.db_index
5.default
6.primary_key
7.unique
-- 关系字段类型
1.ForeignKey 一对多
manufacturer.car_set.all()
2.OneToOneField 一对一
3.ManyToManyField 多对多
-- 元选项
# 创建模型类之后自定义表名 class Meta: ‘‘‘自定义表名‘‘‘ db_table = ‘bookinfo‘ # 在生成迁移之后的0001——initial.py文件中多处一个; # option={ ‘db_table‘:‘bookinfo‘ # 表示表的名字已经被自定义了; # 默认生成的表的名字是:应用名_小写的模型类名; # 如:booktest_heroinfo; } # 表示当前不是模型类,模型不会被用来创建所有数据表 class Meta: ‘‘‘表示当前类不是模型类,而是其他模型的抽象基类‘‘‘ abstract = True # 继承模型类,调用其方法
-- 测试数据
# class BookInfo(models.Model): # btitle = models.CharField(max_length=20) # bpub_date = models.DateTimeField() # bread = models.IntegerField(default=0) # bcomment = models.IntegerField(default=0) # isDelete = models.BooleanField(default=False) # class Meta: # db_table = ‘bookinfo‘ # class HeroInfo(models.Model): # hname = models.CharField(max_length=20) # hgender = models.BooleanField(default=True) # isDelete = models.BooleanField(default=False) # hcontent = models.CharField(max_length=100) # hbook = models.ForeignKey(‘BookInfo‘) # insert into bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values # (‘射雕英雄传‘,‘1980-5-1‘,12,34,0), # (‘天龙八部‘,‘1986-7-24‘,36,40,0), # (‘笑傲江湖‘,‘1995-12-24‘,20,80,0), # (‘雪山飞狐‘,‘1987-11-11‘,58,24,0); # insert into model_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values # (‘郭靖‘,1,1,‘降龙十八掌‘,0), # (‘黄蓉‘,0,1,‘打狗棍法‘,0), # (‘黄药师‘,1,1,‘弹指神通‘,0), # (‘欧阳锋‘,1,1,‘蛤蟆功‘,0), # (‘梅超风‘,0,1,‘九阴白骨爪‘,0), # (‘乔峰‘,1,2,‘降龙十八掌‘,0), # (‘段誉‘,1,2,‘六脉神剑‘,0), # (‘虚竹‘,1,2,‘天山六阳掌‘,0), # (‘王语嫣‘,0,2,‘神仙姐姐‘,0), # (‘令狐冲‘,1,3,‘独孤九剑‘,0), # (‘任盈盈‘,0,3,‘弹琴‘,0), # (‘岳不群‘,1,3,‘华山剑法‘,0), # (‘东方不败‘,0,3,‘葵花宝典‘,0), # (‘胡斐‘,1,4,‘胡家刀法‘,0), # (‘苗若兰‘,0,4,‘黄衣‘,0), # (‘程灵素‘,0,4,‘医术‘,0), # (‘袁紫衣‘,0,4,‘六合拳‘,0);
-- 模型类方法
1.str方法 # 返回模型类对象的描述 2.save方法 # 将对象保存至数据库 3.delete方法 # 级联删除 user=models.ForeignKey(user,blank=True,null=True,on_delete=models.SET_NULL) # 没看懂
-- 管理器(模型的成员)
# 模型类的属性,将对象与数据表映射;
-- 类的属性
# objects是Manager类型的对象,django中定义好的类,用于数据库的交互; # 如果没有指定,默认提供一个管理器objects;
-- 修改管理器名称(默认objects)
# models.py文件中 from django.db import models class Person(models.Model): # 这个模型类里面有一个属性叫做person person = models.Mangager() # 在Manager()类中完成字段信息的映射;
-- 自定义管理器
# 默认管理器方法太少,可以通过自定义管理器来新增方法;
-- 修改管理器返回的原始查询集
class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager, self).get_queryset().filter(isDelete=False) # 修改父类Manager中的get_queryset()方法,在父类方法后面添加一个filter(isDelete=Fales); # super(BookInfoManager, self).get_queryset()表示父类的方法;
class BookInfo(models.Model): ... 字段赋值 books1 = BookInfoManger() # 表示重写父类后,重新定义给新的管理器;
-- 向管理器类中添加额外的方法
# 模型类中无法再使用__init__方法,因为父类已经使用创建了很多东西; # 所以,我们通过在模型类中使用类方法; @classmethod def create(cls, btitle, bpub_date): b = BookInfo b.btitle = btitle ... return b 或者: 在自定义管理器中添加上面的方法;(推荐使用)
-- 查询
-- 获取所有对象
object1 = 表名.objects.all() # bookinfo = BookInfo.objects.all() # 可以通过切片选择范围内对象(限制查询集合) object2 = 表名.objects.all()[1,3]
-- 过滤器(查询集的方法)
-- 条件查询
1.filter() # 满足查询,始终返回一个查询集,列表 2.exclude() # 不满足查询 3.order_by() 4.values() 5.all()
-- 语法规则:
# 表名.objects.filter(字段名__运算符判断=‘值‘)
-- 运算符
1.exact # 精确匹配 2.contains # 包含 3.startswith # 以指定值开头 4.endswith # 以指定值结束 5.isnull # 不为空 6.in # 范围内查询 7.gt/gte/lt/lte # 运算符前加上i,不区分大小写;
-- 例子
# filter()过滤器 # 精确查询 bookinfo_3 = BookInfo.objects.filter(id__exact=1) print(bookinfo_3) # 包含查询 bookinfo4 = BookInfo.objects.filter(book_title__contains=‘八‘) print(bookinfo4) # 首字查询 bookinfo5 = BookInfo.objects.filter(book_title__startswith=‘天‘) print(bookinfo5) # 尾字查询 bookinfo6 = BookInfo.objects.filter(book_title__endswith=‘传‘) print(bookinfo6) # 查看不为空的字段值 bookinfo7 = BookInfo.objects.filter(book_title__isnull=False) print(bookinfo7) # 查询指定编号范围的字段值 bookinfo8 = BookInfo.objects.filter(pk__in=[1,3]) print(bookinfo8) # 查询大小范围内的字段值 bookinfo9 = BookInfo.objects.filter(id__gt=3) print(bookinfo9) # exclude()过滤器 bookinfo10 = BookInfo.objects.exclude(id__gt=3) print(bookinfo10)
-- 返回单个值的方法
-- get 获取单一对象
bookinfo11 = BookInfo.objects.get(book_title = ‘天龙八部‘) print(bookinfo11) # get如果查询的不仅一个对象,会触发MultipleObjectsReturned异常 bookinfo12 = BookInfo.objects.get(id__gt=2) print(bookinfo12) # get如果查询不到对象,会触发DoesNotExist异常 bookinfo13 = BookInfo.objects.get(book_title = ‘天龙七部‘) print(bookinfo13) -- count() -- first() -- last() -- exists()
-- F对象和Q对象
# 需要导入模块中的对象
from django.db.models import F, Q
-- F对象
# 实现两个属性之间的比较 bookinfo14 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)) print(bookinfo14) # 可以在F()对象上使用算数运算 bookinfo15 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)*2) print(bookinfo15)
-- Q对象(query查询)
# 构造查询对象 -- 逻辑与:多个过滤器逐个调用 bookinfo16 = BookInfo.objects.filter(book_read__lte=40, id__lte=3) print(bookinfo16) bookinfo17 = BookInfo.objects.filter(book_read__lte=40).filter(id__lte=3) print(bookinfo17) -- 利用Q对象实现,或与非 -- 基本语法 Q(属性名__运算符=值) # &表示逻辑与,|表示逻辑或 bookinfo18 = BookInfo.objects.filter(Q(book_read__lte=40) & Q(id__lte=3)) print(bookinfo18) bookinfo19 = BookInfo.objects.filter(Q(book_read__lte=40) | Q(id__lte=3)) print(bookinfo19)
-- 聚合函数
# 需要导入模块 from django.db.models import * 表名.objects.aggregate(Sum(字段名)) 1.Avg 2.Count # 查询总数的时候一般不使用; # BookInfo.objects.count() 替代; 3.Max 4.Min 5.Sum bookinfo20 = BookInfo.objects.aggregate(Sum(‘book_read‘)) print(bookinfo20)
-- 关联查询
-- 一对多,一类
1.获取单一字段对象 object1 = 表名.objects.get(‘条件‘) # book = BookInfo.objects.get(id=1) 2.获取对应所有所有对象信息 object2 = object1.小写表名_set.all() # heroes = book.heroinfo_set.all()
-- 多对一,多类
1.获取单一字段对象 object1 = 表名.objects.get(‘条件‘) # hero = HeroInfo.objects.get(id=1) 2.获取对应对象信息 object1.字段属性 # hero.hero_book
-- 通过模型类实现关联查询
# 暂略
-- 自关联
# 略
以上是关于Django框架——模型(数据库操作)的主要内容,如果未能解决你的问题,请参考以下文章