-- 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框架——模型(数据库操作)相关推荐

  1. Django框架之数据库操作

    文章目录 一.前言 二.数据库配置 三.数据表创建 1.单表创建 2.关联表创建 四.ORM增删改查 1.新增数据(C) (1)创建单表数据 (2)创建从表数据 2.读取数据(R) (1)读取多条数据 ...

  2. Django框架——ORM数据库操作

    目录 一.增加 二.删除 三.修改 四.查询 1.基本查询 2.过滤查询 3.过滤条件语法 4.F对象和Q对象 5.聚合函数 6.排序函数 7.关联查询 测试数据:BookInfo表 PeopleIn ...

  3. python学习第6天---django框架---模型类及数据库操作

    python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...

  4. Django工程-ORM模型数据库操作详解(六)

    Django工程-ORM模型数据库操作 下面以用户和图书表模型进行ORM的基本操作使用 ORM模型介绍 1.增加 通过模型类.objects.create()保存. >>> User ...

  5. Django 07. django框架模型之增删改查基本操作

    简介 django框架模型之数据库表增删改查基本操作 1. 生成数据库表结构         models.py #!/usr/bin/env python # -*- coding: utf-8 - ...

  6. 在线车辆推荐网 Python语言+Django框架+Mysql数据库 基于用户、物品的协同过滤推荐算法 开发在线汽车推荐系统 二手车网站推荐系统 分布式大数据、机器学习、人工智能开发

    在线车辆推荐网 Python语言+Django框架+Mysql数据库 基于用户.物品的协同过滤推荐算法 开发在线汽车推荐系统 二手车网站推荐系统 分布式大数据.机器学习.人工智能开发 CarRecom ...

  7. 关于Django中的数据库操作API之distinct去重的一个误传

    django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个distinct()函数也是这个 ...

  8. django 框架模型之models常用的Field,这些Field的参数、及常见错误原因及处理方案。

    1. django 模型models 常用字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一个自增列,必须设置 ...

  9. Python之django框架模型(models)详解

    第一部分:模型类介绍 1.1 定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建 ...

最新文章

  1. 特朗普“模仿”奥巴马?进阶版换脸技术DeepFakes来了
  2. 走向ASP.NET架构设计-第六章-服务层设计(中篇)
  3. android 获取快捷开关_适合收藏丨3dmax快捷键命令大全
  4. 神经网络总结(初稿)
  5. 当前系统时间与服务器时间,操作系统时间和服务器时间
  6. java stream intermediateterminal方法
  7. android 炫酷3d主页,五款超酷安卓手机3D桌面软件合辑推荐
  8. 【06年博文搬家】一个修改时间的批处理程序
  9. WEB应用支持RESTFUL风格方法
  10. 三千万海外用户的天才程序员之死
  11. 短视频app源码开发,Java使用ffmpeg实现音视频分离
  12. Unity 工具 之 XChart UGUI 表格工具,轻松简单的帮你实现需要的数据图表形式,建议 Mark 一下
  13. 使用超级鹰模拟登录验证码报错的解决办法
  14. 力扣题库63-不同路径II(C语言)
  15. 4递归实现阶乘计算器 5递归实现TreeView绑定表MenuTree
  16. 照片处理:PS三步轻松实现背景虚化
  17. JSD-2204-VueCLI-Day01
  18. HTML实现在线代码格式化、美化、加密、解密、压缩、一键转JavaScript功能工具-toolfk程序员工具网
  19. 无法在 Mountain Lion 上启动 visual Paradigm 软件安装程序
  20. 英国《新科学家》杂志:研究显示人们上假新闻的当可能是因懒得思考

热门文章

  1. 分析酸对酸性染料染羊毛染色性能的影响?举例说明酸性染料染羊毛时,如何选择合适的染浴pH值?并说明原因。
  2. php静态分析工具window,window_SpeedPHP框架核心调试工具,在日常的编程开发当中,开发 - phpStudy...
  3. 2021河南高考成绩查询郸城一高,郸城一高在河南有多牛 2021年高考成绩
  4. [codevs] 1098 均分纸牌
  5. Qt中QLabel的背景图片设置问题
  6. 多益网络 视频面试面试总结20180816
  7. 私人博客定制---服务器接口封装
  8. 【C++学习笔记五】模板
  9. Insertion Sort——打表找规律
  10. 比较ArrayList和数组的区别