Django之ORM模型
ORM介绍
对象关系映射(Object Relational Mapping,简称ORM)模式的作用是在关系型数据库与业务实体对象之间进行映射,这使得我们不需要再去和复杂的SQL语句打交道,只需要简单的操作对象的属性和方法。ORM通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM的优势体现在以下三个方面:
1. 可移植性强,在Django中只需要在settings.py文件中修改新数据库的配置,然后进行迁移数据的操作即可完成数据库的移植,二部需要对ORM进行任何修改
2. 查询语法简单,让软件开发人员专注于业务逻辑的处理,提高了开发效率
ORM在Django中的应用
字段
- AutoField(Field)
- - int自增列,必须填入参数 primary_key=True
- BigAutoField(AutoField)
- - bigint自增列,必须填入参数 primary_key=True
- 注:当model中如果没有自增列,则自动会创建一个列名为id的列
- from django.db import models
- class UserInfo(models.Model):
- # 自动创建一个列名为id的且为自增的整数列
- username = models.CharField(max_length=32)
- class Group(models.Model):
- # 自定义自增列
- nid = models.AutoField(primary_key=True)
- name = models.CharField(max_length=32)
- SmallIntegerField(IntegerField):
- - 小整数 -32768 ~ 32767
- PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- - 正小整数 0 ~ 32767
- IntegerField(Field)
- - 整数列(有符号的) -2147483648 ~ 2147483647
- PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- - 正整数 0 ~ 2147483647
- BigIntegerField(IntegerField):
- - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
- BooleanField(Field)
- - 布尔值类型
- NullBooleanField(Field):
- - 可以为空的布尔值
- CharField(Field)
- - 字符类型
- - 必须提供max_length参数, max_length表示字符长度
- TextField(Field)
- - 文本类型
- EmailField(CharField):
- - 字符串类型,Django Admin以及ModelForm中提供验证机制
- IPAddressField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
- GenericIPAddressField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- - 参数:
- protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
- unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
- URLField(CharField)
- - 字符串类型,Django Admin以及ModelForm中提供验证 URL
- SlugField(CharField)
- - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
- CommaSeparatedIntegerField(CharField)
- - 字符串类型,格式必须为逗号分割的数字
- UUIDField(Field)
- - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
- FilePathField(Field)
- - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- - 参数:
- path, 文件夹路径
- match=None, 正则匹配
- recursive=False, 递归下面的文件夹
- allow_files=True, 允许文件
- allow_folders=False, 允许文件夹
- FileField(Field)
- - 字符串,路径保存在数据库,文件上传到指定目录
- - 参数:
- upload_to = "" 上传文件的保存路径
- storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- ImageField(FileField)
- - 字符串,路径保存在数据库,文件上传到指定目录
- - 参数:
- upload_to = "" 上传文件的保存路径
- storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
- width_field=None, 上传图片的高度保存的数据库字段名(字符串)
- height_field=None 上传图片的宽度保存的数据库字段名(字符串)
- DateTimeField(DateField)
- - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
- DateField(DateTimeCheckMixin, Field)
- - 日期格式 YYYY-MM-DD
- TimeField(DateTimeCheckMixin, Field)
- - 时间格式 HH:MM[:ss[.uuuuuu]]
- DurationField(Field)
- - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
- FloatField(Field)
- - 浮点型
- DecimalField(Field)
- - 10进制小数
- - 参数:
- max_digits,小数总长度
- decimal_places,小数位长度
- BinaryField(Field)
- - 二进制类型
- 字段相关内容
自定义字段
- class FixedCharField(models.Field):
- """
- 自定义的char类型的字段类
- """
- def __init__(self, max_length, *args, **kwargs):
- self.max_length = max_length
- super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
- def db_type(self, connection):
- """
- 限定生成数据库表的字段类型为char,长度为max_length指定的值
- """
- return 'char(%s)' % self.max_length
- class Class(models.Model):
- id = models.AutoField(primary_key=True)
- title = models.CharField(max_length=25)
- # 使用自定义的char类型的字段
- cname = FixedCharField(max_length=25)
- PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
- 'AutoField': 'integer AUTO_INCREMENT',
- 'BigAutoField': 'bigint AUTO_INCREMENT',
- 'BinaryField': 'longblob',
- 'BooleanField': 'bool',
- 'CharField': 'varchar(%(max_length)s)',
- 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
- 'DateField': 'date',
- 'DateTimeField': 'datetime',
- 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
- 'DurationField': 'bigint',
- 'FileField': 'varchar(%(max_length)s)',
- 'FilePathField': 'varchar(%(max_length)s)',
- 'FloatField': 'double precision',
- 'IntegerField': 'integer',
- 'BigIntegerField': 'bigint',
- 'IPAddressField': 'char(15)',
- 'GenericIPAddressField': 'char(39)',
- 'NullBooleanField': 'bool',
- 'OneToOneField': 'integer',
- 'PositiveIntegerField': 'integer UNSIGNED',
- 'PositiveSmallIntegerField': 'smallint UNSIGNED',
- 'SlugField': 'varchar(%(max_length)s)',
- 'SmallIntegerField': 'smallint',
- 'TextField': 'longtext',
- 'TimeField': 'time',
- 'UUIDField': 'char(32)',
mysql操作
1. 环境
windows/python3.6.0/mysql/MySQLdb,若对mysql操作不熟悉可以查看数据库之MySql
2. 进入root,创建新账户
mysql -u root -p
create user "hello"@"local" identifild by "123456789";
3. 创建djangodb数据库
create database IF NOT EXISTS 'djangodb';
4. 为新用户授权
grant all privileges on djangodb.* to "hello"@"localhost";
flush privileges;
5. 退出root用hello账户登录,查看数据库
mysql -u hello -p
mysql show databases;
django操作mysql
1. 创建工程和应用
django-admin startproject django_mysql
python manage.py startapp blog
可以使用tree /f查看django_mysql目录,以下为blog目录结构
2. 修改setting.py文件中和数据库相关的设置
- DATABASES = {
- 'default': {'ENGINE':'django.db.backends.mysql',
- 'HOST':'127.0.0.1',
- 'PORT':'',
- 'NAME':'djangodb',
- 'USER':'hello',
- 'PASSWORD':'',
- }
3. 通过模型设计数据表
./blog/model.py
- from django.db import models
- # Create your models here.
- from django.db import models #特别注意
- class userinfo(models.Model):
- username=models.CharField(max_length=32)
- password=models.CharField(max_length=32)
- age=models.IntegerField()
4. 向数据表中添加项
./blog/views.py
- from django.shortcuts import HttpResponse
- from .models import userinfo
- # Create your views here.
- def db_handle(request):
- #向数据库中添加数据
- #dic = {"username":"bruce","password":"123456","age":23}
- #dic = {"username":"zhanglin","password":"666666","age":18}
- dic = {"username":"lishi","password":"", "age":99}
- objects = userinfo.objects.all()
- print (objects)
- isexists = False
- if not objects and not isexists:
- userinfo.objects.create(**dic)
- else:
- for object in objects:
- print(object)
- if dic["username"] == object.username:
- isexists = True
- #HttpResponse("username is exits\r\t") #该语句为什么没起作用
- break
- if not isexists:
- userinfo.objects.create(**dic)
- #删除数据
- #userinfo.objects.filter(username="bruce").delete()
- #更新数据
- #userinfo.objects.filter(username="lishi").update(age=99)
- #HttpResponse("ok")
- return render(request, "mysql.html", {"tablerow":objects})
上面的代码中包含了向数据库中添加、删除和更新数据
5. 测试
打开django服务,数据url
python manage.py runserver
http://127.0.0.1:8000/db_handle/
在mysql中查看数据库
图中的blog_userinfo就是我们的数据表,命名方式:应用+models.py中的userinfo函数
渲染
接下来我们将数据库内容通过html显示到网页上
1. 添加templates相关信息
settings.py文件中设置templates路径
- TEMPLATES = [
- {
- 'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
- 'APP_DIRS': False,
- 'OPTIONS': {
- 'context_processors': [
- 'django.template.context_processors.debug',
- 'django.template.context_processors.request',
- 'django.contrib.auth.context_processors.auth',
- 'django.contrib.messages.context_processors.messages',
- ],
- },
- },
- ]
在django_mysql添加templates目录并添加mysql.html文件
- <!DOCTYPE html>
- <html lang="zh-cn">
- <head>
- <meta http-equiv="X-UA_compatible" content="IE=Edge">
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>django_mysql info</title>
- </head>
- <body>
- <h1>django_mysql info</h1>
- <div class="container">
- <table border="" width="">
- <tr>
- <th>用户名</th>
- <th>密码</th>
- <th>年龄</th>
- </tr>
- {%for row in tablerow%}
- <tr>
- <td>{{row.username}}</td>
- <td>{{row.password}}</td>
- <td>{{row.age}}</td>
- </tr>
- {%endfor%}
- </table>
- </div>
- </body>
- </html>
2. 添加urls
在应用的urls.py文件中添加如下信息
- from django.contrib import admin
- from django.urls import path
- from blog import views
- urlpatterns = [
- path('admin/', admin.site.urls),
- path(r'db_handle/', views.db_handle),
- ]
3. 渲染的代码已经在views.py中添加
- return render(request, "mysql.html", {"tablerow":objects})
4. 打开http://127.0.0.1:8000/db_handle/测试
若要查看django更多详细信息,可以参考:django初探-创建简单的博客系统(一)和django初探-创建简单的博客系统(二)
Django之ORM模型的更多相关文章
- django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段
一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...
- python django -2 ORM模型
ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...
- Django中ORM模型总结(一)[概述,查询语句]
理解ORM框架 概述 O:(objects)->类和对象. R:(Relation)->关系,关系数据库中的表格. M:(Mapping)->映射. 作用: 可以通过类和类对象就可以 ...
- Django ORM模型的一点体会
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...
- Django ORM模型:想说爱你不容易
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...
- django ORM模型表的一对多、多对多关系、万能双下划线查询
一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...
- Django (学习第二部 ORM 模型层)
Django对数据库的操作 Django的 ORM 简介 ORM操作 (增删改查) ORM操作数据库的增删改查 ORM创建表关系 ORM中常用字段及参数 数据库的查询优化 ORM中如何开启事务 ORM ...
- Django(10)ORM模型介绍
前言 随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL语句. 2. ...
- Django之ORM对象关系模型
MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...
随机推荐
- dojo之dojox/data/CsvStore初始化
dojo之dojox/data/CsvStore初始化 1.var csvStore = new dojox.data.CsvStore({url:"student.csv"}); ...
- vxWorks/BootROM Imageq启动顺序详解
vxWorks/BootROM Imageq启动顺序详解 VxWorks image 分为在ROM中运行和在RAM中运行两种,两者启动顺序的区别在于sysInit()函数的调用,该函数在RAM ...
- Flex读取txt文件中的内容(二)
Flex读取txt文件中的内容 自动生成的文件 LoadTxt-app.xml: <?xml version="1.0" encoding="utf-8" ...
- 芝麻HTTP:JavaScript加密逻辑分析与Python模拟执行实现数据爬取
本节来说明一下 JavaScript 加密逻辑分析并利用 Python 模拟执行 JavaScript 实现数据爬取的过程.在这里以中国空气质量在线监测分析平台为例来进行分析,主要分析其加密逻辑及破解 ...
- 浅谈Javascript中的Label语句
如: begin: for (var i = 0; i < 10 ; i++ ){ alert(i); } 举一个比较典型的例子,看完后即明白 Label 的应用:(未添加 Label) var ...
- HALCON学习-下载、安装
下载地址: 官网 HALCON学习网 安装: 直接安装文件halcon-12.0-windows-x86.exe 破解,汉化: 在HALCON学习网中有Licence文件“license_suppor ...
- Selenium简介与环境搭配-----Selenium快速入门(一)
Selenium是一套自动化测试框架.官方网站是:https://www.seleniumhq.org/ 某些童鞋访问可能需要FQ. Selenium支持多种语言开发,例如Java,Python,C ...
- 【小白学爬虫连载(10)】–如何用Python实现模拟登陆网站
Python如何实现模拟登陆爬取Python实现模拟登陆的方式简单来说有三种:一.采用post请求提交表单的方式实现.二.利用浏览器登陆网站记录登陆成功后的cookies,采用get的请求方式,传入c ...
- Java汉字乱码问题
window->preferences->输入框输入"encod" 将text file encoding 从default改成other utf-8 同理,css,H ...
- hadoop新增kerberos租户
第一步 在kerberos服务器所在主机 通过kadmin.local,也可以通过kadmin 输入用户密码登录 kadmin.local: addprinc -randkey it1@STARYEA ...