django中models模块为各类数据库提供了统一的api,可根据不同的业务需求配置数据库。

models模块开发流程:

  1. 配置数据库  详情:https://www.cnblogs.com/Vera-y/p/11492314.html
  2. 定义模型类: 一个模型类在数据库中对应一张数据表
  3. 生成迁移文件
  4. 执行迁移文件生成数据表
  5. 使用模型类进行增删改查

这里主要是介绍models模块,那就不得不提到ORM

ORM : 对象-关系-映射

django中的增删改查,在orm中转换为create/insert等语句再和各种数据库进行交互,之后,在数据库中得到的数据集等在通过orm转换为python中的数据表

orm的任务:

  • 根据对象的类型生成表结构
  • 将对象、列表的操作转换为sql语句
  • 将sql语句查询到的结构转换为对象、列表

优点:
  减轻开发人员的工作量,不需要面对因数据库的变更而修改代码

一个模型类在数据库中对应一张表,在模型类中定义的属性,对应表中的一个字段

from django.db import models
class Students(models.Model): # 模型类
# 字段
id = models.AutoField(primary_key=True) # 创建一个自增的主键字段
name = models.CharField(null=False,max_length=20) # 创建一个varchar(20)类型的name且不能为空

django 会为表增加自动给增长的主键列,每个模型只能有一个主键列,若使用选项设置某属性为主键列后,则django不会再生存默认的主键列。

属性命名限制:1.遵循标识符规则 2.不允许连续的下划线

字段类型:字段的创建

AutoField

主键类型,一个根据实际id自动增长的integerField,通常不指定,若不指定,一个主键字段将自动添加到模型中

CharField(max_length = 字符长度) 字符串类型
TextField 大文本字段,一般超过4000使用,(显示的是一个文本域)
IntegerField 整数类型
DecimalField(max_digits=None,decimal_places=None) 十进制浮点数类型

max_digits:位数总数
decimal_places:小数点后的数字位数

FloatField 浮点数类型
BooleanField true/false 字段,默认的表单控制室checkboxInput
NullBooleanField null/true/false
DateField([auto_now=False,auto_now_add=False]) 日期类型

auto_now:每次保存对象时,自动设置为当前时间(最后一次修改)
auto_now_add:每次对象被创建时,被自动设置为当前时间(第一次创建)
auto_now,anto_now_add,default 不能同时被设置

TimeField 时间类型,参数和DateField相同
DateTimeField 日期-时间类型,参数和DateField相同
FileField 上传文件的字段
ImageField 继承了FileField所有属性和方法,确保是一个有效的image文件

举个栗子:

from django.db import models

class Students(models.Model):
# 字段
id = models.AutoField(primary_key=True) # 创建一个自增的主键字段
name = models.CharField(null=False,max_length=20) # 创建一个varchar(20)类型的name且不能为空
age = models.IntegerField()
gender = models.BooleanField()

字段选项:对字段进行的约束

null 设置为true,存入空值到数据库,默认为false,数据库范畴
blank 设为true ,该字段允许为空白,默认为false,表单验证范畴
db_column 设置字段的名称,若字段名未指定,则使用设置的属性名称
db_index 设为true,表会为此字段创建索引
default 设置为默认值
primary_key 设置为true ,则该字段会成为模型的主键
unique 设置为true ,这个字段在表中必须有唯一值

数据表间的关系

ForeignKey 一对多(常用)将字段定义在多的端中
ManyToManyField

多对多,将字段定义在两端中

OneToOneField 一对一,将字段定义在任意一端中

举个栗子:

sgrade = models.ForeignKey("Grades")

元选项:在模型类中定义Meta类,用于设置元信息(对数据库中具体数据的操作(表级操作)例:排序)

例:db_table:定义数据表名,若不定义,则数据表名默认为:项目名小写_类名小写

ordering:默认排序字段,获取列表时使用  ordering['id']:升序 ordering['-id']:降序

举个栗子:

from django.db import models
class Students(models.Model):
# 字段
id = models.AutoField(primary_key=True)
name = models.CharField(null=False,max_length=20)
age = models.IntegerField(null=False)
gender = models.BooleanField() class Meta:
db_table = "students" # 修改成功!
ordering = ['id']

栗子果:

mysql> use python_mysql
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_python_mysql |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| students |
+----------------------------+

模型成员

模型的类属性:

当模型类没有指定管理器,django则为模型创建一个名为objects的管理器,用于和数据库进行交互(即django模型与数据库交互的接口)

自定义模型管理器:

  stuObj = models.Manager()  # 自定义的模型管理器(貌似没什么luan用)

更深入的就是自定义模型管理器类(Manager()类):

from django.db import models

class studentsManager(models.Manager):
def get_queryset(self):
return super(studentsManager, self).get_queryset().filter(gender=False)
# filter() 过滤函数可多次叠加 class Students(models.Model):
stuObj = models.Manager() # 自定义的模型管理器
stuObj1 = studentsManager()
id = models.AutoField(primary_key=True)
name = models.CharField(null=False,max_length=20)
age = models.IntegerField(null=False)
gender = models.BooleanField(default=True) class Meta:
db_table = "students"
ordering = ['id']

可在terminal中验证:

>>python manage.py shell     # 进入python环境

>>>from my_inn.models import Students;

>>>Students.stuObj1.all();

>>>Students.stuObj.all();        # 可作结果对比

模型的创建对象

目的:向数据库中添加数据,当创建对象时,django不会对数据进行读写操作,只有调用save()方法后才与数据库进行交互

两种方法:

  • 在模型类中增加一个类方法(方法上加上@staticmethod)(即在models 创建表的类下添加方法)
  • 在定义管理器中添加一个方法(即在models 中studentsManager管理器中添加方法)

注:__init__方法在父类models.Model中被使用,所以我们创建的对象是空对象。

举个栗子:

from django.db import models

class studentsManager(models.Manager):
def get_queryset(self):
return super(studentsManager, self).get_queryset().filter(gender=False)
# filter() 过滤函数可多次叠加
# 管理器中创建对象
def createStudent1(self, sname, sage, sgender):
# stu1 = Students() # 只能创建students类的属性,若有外键就不通用勒
stu1 = self.model() # 类型:'my_inn.models.Students'
stu1.name = sname
stu1.age = sage
stu1.gender = sgender
return stu1 class Students(models.Model):
stuObj = models.Manager() # 自定义的模型管理器
stuObj1 = studentsManager()
# 字段
id = models.AutoField(primary_key=True)
name = models.CharField(null=False,max_length=20)
age = models.IntegerField(null=False)
gender = models.BooleanField(default=True) class Meta:
db_table = "students"
ordering = ['id'] # 定义一个类方法创建对象
@classmethod
def createStudent(cls, sname, sage, sgender):
stu = cls(name=sname, age=sage,gender=sgender)
return stu

models.py

对应的在views.py中的函数操作:

from django.shortcuts import render,redirect,HttpResponse
from my_inn import models def addstudent(request): # 类方法创建对象
stu = Students.createStudent('nini',22,0)
stu.save() # 更新数据库
return HttpResponse('...') def addstudent1(request): # 管理器创建对象
stu = Students.stuObj1.createStudent('nili',23,1)
stu.save() # 更新数据库
return HttpResponse('...')

Views.py

python_django_models模块的更多相关文章

  1. python_django_models模块中的查询

    查询集:表示从数据库获取的对象集合,查询集可以有多个过滤器,过滤器就是一个函数(方法),基于所给参数限制查询集结果 从sql角度来说,查询集和select等价,过滤器和where等价 查询集特点: 惰 ...

  2. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  5. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  6. Python标准模块--Unicode

    1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...

  7. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

  8. 自己实现一个javascript事件模块

    nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...

  9. 理解nodejs模块的scope

    描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...

随机推荐

  1. java中trim()方法是用来干什么的?

    trim()的作用是去掉字符串两端的多余的空格,注意,是两端的空格,且无论两端的空格有多少个都会去掉,当然 中间的那些空格不会被去掉,如: String s = "  a s f g     ...

  2. struts2自定义拦截器 设置session并跳转

    实例功能:当用户登陆后,session超时后则返回到登陆页面重新登陆. 为了更好的实现此功能我们先将session失效时间设置的小点,这里我们设置成1分钟 修改web.xml view plainco ...

  3. 集合 HashMap 的原理,与 Hashtable、ConcurrentHashMap 的区别

    一.HashMap 的原理 1.HashMap简介 简单来讲,HashMap底层是由数组+链表的形式实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表 ...

  4. DNF游戏币拼团

    DNF游戏币拼团活动方案 活动目的: 通过拼团的方式来实现老拉新和现实新用户转换,可以通过有需求的用户来告知好友来进行用户裂变 活动时间:预计时间2018.11.11-2018.11.23 SLOGA ...

  5. Java oop 第13章_多线程

    第13章_多线程 一.   多线程相关的概念:  程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念.   进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...

  6. 网络编程之 OSI七层协议

    内容目录: 1.软件开发架构 2.OSI七层协议 3.每层协议介绍 1.软件开发架构 c/s架构: c:客户端 s:服务端 b/s架构: b:浏览器 s:服务器 本质:b/s其实也是c/s 2.OSI ...

  7. utmp, wtmp - 登 录 记 录(login records)

    SYNOPSIS[总览] #include DESCRIPTION[描述] utmp 文 件 用 于 记 录 当 前 系 统 用 户 是 哪 些 人. 但 是 实 际 的 人 数 可 能 比 这 个 ...

  8. 解决 Onenote 默认全角输入的一种解决办法(输入法已经设置为默认半角)

    环境说明:Windows 7 x64 Ultimate SP1, QQ 拼音输入法 6.1(5306),Onenote 2016 x64 问题描述:每次打开Onenote,在输入法已经设置为默认半角的 ...

  9. jdbc打印sql语句-p6spy配置

    @Configuration public class P6SpyConfig { /** * P6数据源包装, 打印SQL语句 */ @Bean public P6DataSourceBeanPos ...

  10. 本地仓库_remote.repositories(拒绝访问)

    问题描述: 通过阿里云配置本地的 Maven 仓库,使用 Maven 命令在进行打包.编译等一系列操作时候,总是出现提示某个 Jar 文件 ---> 『.....\ _remote.reposi ...