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
-- 通过模型类实现关联查询
# 暂略
-- 自关联
# 略
转载于:https://blog.51cto.com/13269293/1971208
Django框架——模型(数据库操作)相关推荐
- Django框架之数据库操作
文章目录 一.前言 二.数据库配置 三.数据表创建 1.单表创建 2.关联表创建 四.ORM增删改查 1.新增数据(C) (1)创建单表数据 (2)创建从表数据 2.读取数据(R) (1)读取多条数据 ...
- Django框架——ORM数据库操作
目录 一.增加 二.删除 三.修改 四.查询 1.基本查询 2.过滤查询 3.过滤条件语法 4.F对象和Q对象 5.聚合函数 6.排序函数 7.关联查询 测试数据:BookInfo表 PeopleIn ...
- python学习第6天---django框架---模型类及数据库操作
python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...
- Django工程-ORM模型数据库操作详解(六)
Django工程-ORM模型数据库操作 下面以用户和图书表模型进行ORM的基本操作使用 ORM模型介绍 1.增加 通过模型类.objects.create()保存. >>> User ...
- Django 07. django框架模型之增删改查基本操作
简介 django框架模型之数据库表增删改查基本操作 1. 生成数据库表结构 models.py #!/usr/bin/env python # -*- coding: utf-8 - ...
- 在线车辆推荐网 Python语言+Django框架+Mysql数据库 基于用户、物品的协同过滤推荐算法 开发在线汽车推荐系统 二手车网站推荐系统 分布式大数据、机器学习、人工智能开发
在线车辆推荐网 Python语言+Django框架+Mysql数据库 基于用户.物品的协同过滤推荐算法 开发在线汽车推荐系统 二手车网站推荐系统 分布式大数据.机器学习.人工智能开发 CarRecom ...
- 关于Django中的数据库操作API之distinct去重的一个误传
django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个distinct()函数也是这个 ...
- django 框架模型之models常用的Field,这些Field的参数、及常见错误原因及处理方案。
1. django 模型models 常用字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一个自增列,必须设置 ...
- Python之django框架模型(models)详解
第一部分:模型类介绍 1.1 定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建 ...
最新文章
- 特朗普“模仿”奥巴马?进阶版换脸技术DeepFakes来了
- 走向ASP.NET架构设计-第六章-服务层设计(中篇)
- android 获取快捷开关_适合收藏丨3dmax快捷键命令大全
- 神经网络总结(初稿)
- 当前系统时间与服务器时间,操作系统时间和服务器时间
- java stream intermediateterminal方法
- android 炫酷3d主页,五款超酷安卓手机3D桌面软件合辑推荐
- 【06年博文搬家】一个修改时间的批处理程序
- WEB应用支持RESTFUL风格方法
- 三千万海外用户的天才程序员之死
- 短视频app源码开发,Java使用ffmpeg实现音视频分离
- Unity 工具 之 XChart UGUI 表格工具,轻松简单的帮你实现需要的数据图表形式,建议 Mark 一下
- 使用超级鹰模拟登录验证码报错的解决办法
- 力扣题库63-不同路径II(C语言)
- 4递归实现阶乘计算器 5递归实现TreeView绑定表MenuTree
- 照片处理:PS三步轻松实现背景虚化
- JSD-2204-VueCLI-Day01
- HTML实现在线代码格式化、美化、加密、解密、压缩、一键转JavaScript功能工具-toolfk程序员工具网
- 无法在 Mountain Lion 上启动 visual Paradigm 软件安装程序
- 英国《新科学家》杂志:研究显示人们上假新闻的当可能是因懒得思考
热门文章
- 分析酸对酸性染料染羊毛染色性能的影响?举例说明酸性染料染羊毛时,如何选择合适的染浴pH值?并说明原因。
- php静态分析工具window,window_SpeedPHP框架核心调试工具,在日常的编程开发当中,开发 - phpStudy...
- 2021河南高考成绩查询郸城一高,郸城一高在河南有多牛 2021年高考成绩
- [codevs] 1098 均分纸牌
- Qt中QLabel的背景图片设置问题
- 多益网络 视频面试面试总结20180816
- 私人博客定制---服务器接口封装
- 【C++学习笔记五】模板
- Insertion Sort——打表找规律
- 比较ArrayList和数组的区别