python框架Django中MTV之Model(数据模型)
MTV框架之Model(数据模型)
关注公众号“轻松学编程”了解更多。
1、连接MySQL数据库
项目中的settings.py设置范例
# 配置数据库
DATABASES = {
'default': {
# 数据库引擎
'ENGINE': 'django.db.backends.mysql',
# 数据库名称
'NAME': 'axf',
# 账号和密码
'USER': 'root',
'PASSWORD': '123456',
# IP和端口
'HOST': 'localhost',
'PORT': '3306'
}
}
项目中的init.py导入pymysql
import pymysql
pymysql.install_as_MySQLdb()
2、ORM
- ObjectRelationalMapping=对象关系映射
- 将具体语言下的【数据及其结构(通常以类表示)】映射为数据库的【表结构和数据】
- 在Django中,一旦数据结构发生变化,就需要重新进行数据迁移
3、数据迁移操作
方法一:在Terminal窗口输入:
- python manage.py makemigrations 生成数据迁移py文件
- python manage.py migrate 执行数据迁移
方法二、在工具栏Tools->Run manage.py Task…窗口输入:
- makemigrations 生成数据迁移py文件
- migrate 执行数据迁移
4、数据定义
数据类型
- 整型:models.IntegerField(default=1)
- 浮点型:models.FloatField(default=0)
- 字符串: models.CharField(max_length=32, unique=True)
- 长文本:models.TextField(db_column=‘ps’)
- 大文本字段,一般超过4000使用
- 布尔型:models.BooleanField(default=False)
- 带空值布尔型:NullBooleanField
- 支持null、true、false三种值
- 日期时间:models.DateTimeField(auto_now=True)
- 使用Python的datetime.datetime实例表示的日期和时间
- 若auto_now=True,每次保存对象时,自动设置该字段为当前时间
- 若auto_now_add=True,当对象第一次被创建时自动设置当前时间(一次性的时间戳)
- 注意:auto_now_add, auto_now,default三者是互斥的
- 其它字段类型
- 带小数点:DecimalField(max_digits=None, decimal_places=None)
- 使用python的Decimal实例表示的十进制浮点数
- max_digits=总位数
- decimal_places=小数位数
- 日期:DateField([auto_now=False, auto_now_add=False])
- 使用Python的datetime.date实例表示的日期
- 时间:TimeField
- 使用Python的datetime.time实例表示的时间
- 主键:a_id = models.AutoField(primary_key=True)
- 一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
- 文件:FileField
- 上传文件字段
- 图像:icon = models.ImageField(upload_to=‘icons’)
- 继承于FileField,框架对上传的对象进行校验,确保它是个有效的image
- 带小数点:DecimalField(max_digits=None, decimal_places=None)
- 表关系字段(外键)
字段约束
primary_key=False
- django会为表增加自动增长的主键列
- 如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
max_length=None
unique=False
null=False
- 如果为True,则默认以空值NULL填充
blank=False
- 如果为True,则该字段允许为空白(即空字符串),这个约束常常用于表单验证
default=NOT_PROVIDED
db_index=False
- 若值为 True, 则在表中会为此字段创建索引
db_column=None
- 字段的名称,如果未指定,则使用属性的名称
完整约束源码
class Field(RegisterLookupMixin): def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='',
db_column=None,
db_tablespace=None, auto_created=False, validators=(),
error_messages=None):
元信息
- class Meta:
- db_table = ‘Flower’ #放在模型中,自定义生成的表名
- ordering = ["-f_color"] #放在模型中,对表进行默认排序
- 这是一个 tuple 或一个字符串列表. 每个字符串是一个字段名带及一个可选的前缀 “-” , 这个前缀表示按降序排序(递减). 若没有这个前缀,则表示按升序排序.字符串 “?” 表示随机排序.
- class Meta:
范例:用户定义
# 用户数据模型
class UserModel(models.Model): # 用户名密码邮箱
username = models.CharField(max_length=32, unique=True)
password = models.CharField(max_length=256)
email = models.CharField(max_length=64, unique=True) # False 代表女
sex = models.BooleanField(default=False) # 头像,图片字段,上传到静态资源文件夹下的icons/
icon = models.ImageField(upload_to='icons') # 是否被逻辑删除
is_delete = models.BooleanField(default=False) class Meta:
#定义表名为t_user
db_table = "t_user"
5、数据查询
- 查询语法
- XXX.objects.all()
- XXX.objects.get(k1=v1,k2=v2)
- 过滤器
- XXX.objects.filter(条件语句)
- XXX.objects.exclude(条件语句)
- 过滤器
- filter(条件语句):获取符合条件的
- exclude(条件语句):去除不符合条件的
- 条件语句
- 格式
- 格式1:属性名=值(忽略大小写)
- 格式2:属性名__运算符=临界值
- 运算符
- gt
- lt
- gte
- lte
- startswith
- 大小写敏感
- endswith
- contains
- exact
- istartswith
- i=忽略大小写
- iendswith
- icontains
- iexact
- 格式
- 缓存的二次筛选
- 查询时允许多个过滤器串联使用(链式调用)
- 只有第一次会执行数据库查询,后续操作是对已有结果集的筛选
- Q对象:实现复杂条件
- Q(条件语句) & Q(条件语句)
- 条件与
- Q(条件语句) | Q(条件语句)
- 条件或
- ~ Q(条件语句)
- 条件非
- Q(条件语句) & Q(条件语句)
6、表关系
- 一对一(OneToOneField)
- 将关系字段定义在任意一方
- Person-IDCard
一张身份证对应着一个人 - 从表IDCard持有外键
- Person-IDCard
- 一访问一
- 格式:对象.模型类小写
- idcard = person.idcard
- 将关系字段定义在任意一方
- 一对多(ForeignKey)
- 将关系字段定义在多方
- Person-Hobby
- 多方Hobby持有外键
- 一访问多
- 格式:对象.模型类小写_set
- hobbies = person.hobby_set
- 将关系字段定义在多方
- 多对多(ManyToManyField)
- 将关系字段定义在任意一方
- Buyer-Goods
- 从表Goods声明关联关系
- 多a访问多b
- goods.g_buyers.add(buyer)
- buyers = goods.g_buyers.all()
- goods_list = buyer.goods_set.all()
- 将关系字段定义在任意一方
- on_delete
- 定义删除对象时如何处理其级联数据(其外键/关系字段指向的数据)
- 可选值
- models.CASCADE
- 默认值,默认删除级联数据
- models.PROTECT
- 不存在级联数据的时候允许删除
- 当存在级联数据的时候删除会抛出保护异常
- models.SET_NULL
- 级联数据赋值为空
- models.SET_DEFAULT
- 前提是字段本身有默认值
- models.SET()
- 删除的时候重新动态指向一个实体
- models.CASCADE
- 维护表关系思路
- 在从表中添加关系字段,其类型即为【对方对象(或对象容器)】
- 框架自动为主表添加对应的关系字段,其类型即为【对方对象(或对象容器)】
- .对方类名,IDE会自动提示可用的属性
7、Manager
显式属性/隐式属性
- 显式属性
- 开发者手动定义的,直接看的到的
- 隐式属性
- 系统/框架根据需求,自动创建的对象
- objects是model.Manager对象
- 当我们手动创建了Manager对象的时候,它就不会自动生成了
- 显式属性
好处:配置默认的数据创建方式和查询方式
创建类并指定管理器
class Dog(models.Model):
d_name = models.CharField(max_length=16)
d_legs = models.IntegerField(default=4)
is_delete = models.BooleanField(default=False) # 交由管理器进行管理
d_manager = MyManager()
定义管理器类
class MyManager(models.Manager):
定义创建实例方法
# 创建狗的实例,默认两条腿
def create_model(self,d_name, d_legs = 2):
dog = self.model()
dog.d_name = d_name
dog.d_legs = d_legs
return dog
定义查询方法
# 默认不包含被逻辑删除的狗狗
# 先调用model.Manager get_queryset
def get_queryset(self):
return super(MyManager,self).get_queryset().exclude(is_delete=True)
使用管理器类
- 创建实例
- dog = Dog.d_manager.create_model(“中国田园犬”)
- 查询实例
- dogs = Dog.d_manager.all()
- dogs = Dog.d_manager.all().filter(is_delete=False)
- dogs = Dog.d_manager.filter(d_legs__lt=100)
- dogs = Dog.d_manager.filter(Q(d_legs__lt=20)|Q(d_legs__gt=150))
- 创建实例
8、继承
定义父类
案例:动物
# 动物父类
class Animal(models.Model): #名字和腿数
a_name = models.CharField(max_length=16, default='Animal')
a_legs = models.IntegerField(default=4) class Meta: #表名是抽象的,框架不会为当前类创建表
abstract = True
定义子类
案例:狗狗
# 动物子类狗狗
class Dog(Animal):
#已经有了a_name和a_legs #定义自己独有的字段
d_fun = models.TextField()
9、常用API
查询
flowers = Flower.objects.all()
flowers = Flower.objects.all().order_by("-id")[0:2]
flowers = Flower.objects.filter(f_color__gt=100).filter(f_color__lt=150)
flowers = Flower.objects.filter(f_color__gt=100).exclude(f_color__gt=150).filter(f_name__contains=“水”)
flowers = Flower.objects.filter(f_name__endswith=“1”)
flowers = Flower.objects.filter(f_name=“rose”)
flowers = Flower.objects.filter(pk__in=[1,2,3,4])
flowers = Flower.objects.filter(f_time__year=“2019”)
students = Student.objects.filter(s_grade_id__gt=F(‘id’)-5)
----------
flower = Flower.objects.get(pk=10)
flower = Flower.objects.get(f_color=255)
----------
flower = flowers.last()
flower = flowers.first()
if flowers.count() == 0:
if flowers.exists():
----------
dogs = Dog.objects.filter(~Q(d_legs__lt=100))
插入
- grade = Grade()
- grade.g_name = ‘fuck’
- grade.save()
- ----------
- person = Person.objects.create(p_name=“小黄%d”%random.randrange(110))
- p = Buyer.objects.create(b_name=“清醒%d下” % flag)
- goods = Goods.objects.create(g_name=“娃娃%d” % flag, g_price=flag)
删除
- 通过查询得到一个特定的grade对象
- grade.delete()
修改
- 通过查询得到一个特定的grade对象
- grade.gname=‘shit’
- grade.save()
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号


关注我,我们一起成长~~
python框架Django中MTV之Model(数据模型)的更多相关文章
- python框架Django中MTV框架之VIew(业务控制器)
MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...
- python框架Django中MTV框架之Template(模板/界面)
MTV框架之Template(模板/界面) 关注公众号"轻松学编程"了解更多. 1.模板目录位置 应用下 不需要注册 无法跨应用地进行复用 工程下 需要注册 settings.py ...
- python框架django中结合vue进行前后端分离
一:创建django项目 1.django-admin startproject mysite # 创建mysite项目 2.django-admin startapp app01# 创建app01应 ...
- python框架Django中的MTV架构
MTV架构 关注公众号"轻松学编程"了解更多. 通过V对M和T进行连接,用户通过T(界面)对服务器进行访问(发送请求),T把请求传给V(调度),V调用M(数据模型)获取数据,把 ...
- 编程 - Python - 框架 - Django
一.Django简介 百度百科:一个开放源代码的Web框架,由Python语言编写...... 重点:一个大而全的框架,啥都替你考虑好了. 1. web框架介绍 具体介绍Django之前,必须先介绍W ...
- python框架Django简介与安装
Django简介 关注公众号"轻松学编程"了解更多. 发布于2005年,最负盛名且成熟的Python网络框架 最初用来制作在线新闻的Web站点 开源Web框架,遵守BSD协议 BS ...
- Python—在Django中使用Celery
一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...
- 067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...
- 在python的web框架Django中使用SQL Server
在pycharm中安装 安装pyodbc和Django——pyodbc是一个用python写的ODBC引擎 安装Django-pyodbc-azure 在后方网址中查 ...
随机推荐
- Hadoop框架:HDFS简介与Shell管理命令
本文源码:GitHub·点这里 || GitEE·点这里 一.HDFS基本概述 1.HDFS描述 大数据领域一直面对的两大核心模块:数据存储,数据计算,HDFS作为最重要的大数据存储技术,具有高度的容 ...
- Android小部件Widget开发过程中的坑和总结
@ 目录 概述 官方参考 效果图 AndroidManifest.xml Receiver Service Options res/xml/ widget_desktop_options.xml 常用 ...
- nginx 1.12 HTTPS双向认证配置
使用openssl生成相关证书: #生成CA私钥,私钥会被加密,需要设置密码 openssl genrsa -aes256 -out ca.key 2048 #生成CA证书签名请求,需要输入CA私钥密 ...
- 摄像头Sensor 图像格式
以0V7725为例: 顺便介绍一下0V7725的主要管脚,管脚定义能体现功能,体现使用方法.
- matlab中fft快速傅里叶变换
视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...
- 什么是ICD文件
ICD就是IED Capability Description的简称,中文为IED能力描述文件.其中 IED是Intelligent Electronic Device的简称,是智能电子设备 智能电子 ...
- 介绍了ASP。净样板
下载sample application (or see on Github) 内容 问题介绍什么是ASP.NET样板文件NET Boilerplate不是开始创建空的web应用程序从模板域层 关于名 ...
- DE2资源集锦
1.The School of Electrical and Computer Engineering (ECE) at the Georgia Institute of Technology:htt ...
- 编程代码 | C++/C输出阳历万年历—精美日历制作
前言:本文章向大家介绍如何用C语言代码实现万年历使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. void输出万年历(int年, int月, int日 ...
- linux(centos8):prometheus使用mtail监控错误日志
一,mtail的用途? mtail :从应用程序日志中提取指标以导出到时间序列数据库或时间序列计算器 它是一个google开发的日志提取工具,用途就是: 实时读取应用程序的日志. 再通过自己编写的脚本 ...