django之数据库orm

django之数据库orm

一、数据库的配置

1 django默认支持sqlite,mysql, oracle,postgresql数据库。

  <1>sqlite

    django默认使用sqlite的数据库,默认自带sqlite的数据库驱动

    引擎名称:django.db.backends.sqlite3

  <2>mysql

    引擎名称:django.db.backends.mysql

2 mysql驱动程序

MySQLdb(mysql python)

mysqlclient

MySQL

PyMySQL(纯python的mysql驱动程序)

3 在django的项目中会默认使用sqlite数据库,在settings里有如下设置:

修改默认数据库为mysql

如果我们想要更改成mysql数据库,需要修改如下:

因为django默认mysql引擎是MySQLdb,但是在py3中兼容不好,需要改用PyMySQL。

在项目文件名目录下的__init__.py文件中添加

import pymysql
pymysql.install_as_MySQLdb()

并在settings.py文件修改DATABASES:

DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘: ‘xe‘,
        ‘USER‘: ‘a_user‘,           #mysql的用户名
        ‘PASSWORD‘: ‘a_password‘,  #mysql的密码
        ‘HOST‘: ‘‘,
        ‘PORT‘: ‘‘,
    }
}

DATABASES

注意:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建。

创建并生成数据库:

python manage.py makemigrations

python manage.py migrate

执行结果不报错就创建数据库成功了。

ORM(对象关系映射)

用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。

优点:

  1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。

  2 可以避免一些新手程序猿写sql语句带来的性能问题。

缺点:

  1 性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。

  2  对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。

下面用一个大家惯用的书籍/作者/出版商的数据库结构例子来学习Django ORM的语法。

表(模型)的创建:

实例:我们来假定下面这些概念,字段和关系

作者模型:一个作者有姓名。

作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。

出版商模型:出版商有名称,地址,所在城市,省,国家和网站。

书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。

在我们自己建的app项目下的models.py文件

from django.db import models
class Publisher(models.Model):
    name = models.CharField(max_length=30, verbose_name="名称")
    address = models.CharField("地址", max_length=50)
    city = models.CharField(‘城市‘,max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    class Meta:
        verbose_name = ‘出版商‘
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=30)
    def __str__(self):
        return self.name

class AuthorDetail(models.Model):
    sex = models.BooleanField(max_length=1, choices=((0, ‘男‘),(1, ‘女‘),))
    email = models.EmailField()
    address = models.CharField(max_length=50)
    birthday = models.DateField()
    author = models.OneToOneField(Author)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
    def __str__(self):
        return self.title

注意:记得在settings里的INSTALLED_APPS中加入我们自己创建的项目名,我的为‘app01’,然后再同步数据库。

分析代码:

  1  每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。

  2  每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。

  3  模型之间的三种关系:一对一,一对多,多对多。

一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;

一对多:就是主外键关系;

多对多:彼此一对多,自动创建第三张表

  4  模型常用的字段类型以及参数

# AutoField
# 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段; 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.(参阅 _自动主键字段)
# BooleanField
# A true/false field. admin 用 checkbox 来表示此类字段.
# CharField
# 字符串字段, 用于较短的字符串.
#
# 如果要保存大量文本, 使用 TextField.
#
# admin 用一个 <input type="text"> 来表示此类字段 (单行输入).
#
# CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
#
# CommaSeparatedIntegerField
# 用于存放逗号分隔的整数值. 类似 CharField, 必须要有 maxlength 参数.
# DateField
# 一个日期字段. 共有下列额外的可选参数:
#
# Argument    描述
# auto_now    当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
# auto_now_add    当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
# admin 用一个文本框 <input type="text"> 来表示该字段数据(附带一个 JavaScript 日历和一个"Today"快键.
#
# DateTimeField
#  一个日期时间字段. 类似 DateField 支持同样的附加选项.
# admin 用两上文本框 <input type="text"> 表示该字段顺序(附带JavaScript shortcuts).
#
# EmailField
# 一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数.
# FileField
# 一个文件上传字段.
#
# 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don‘t fill up the given directory).
#
# admin 用一个``<input type="file">``部件表示该字段保存的数据(一个文件上传部件) .
#
# 在一个 model 中使用 FileField 或 ImageField 需要以下步骤:
#
# 在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件. (出于性能考虑,这些文件并不保存到数据库.) 定义 MEDIA_URL 作为该目录的公共 URL. 要确保该目录对 WEB 服务器用户帐号是可写的.
# 在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件.
# 你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT). 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数.举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object.get_mug_shot_url }} 这样的方式得到图像的绝对路径.
# FilePathField
# 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
#
# 参数    描述
# path    必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目. Example: "/home/images".
# match    可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名. 注意这个正则表达式只会应用到 base filename 而不是路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
# recursive    可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
# 这三个参数可以同时使用.
#
# 我已经告诉过你 match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
#
# FilePathField(path="/home/images", match="foo.*", recursive=True)
# ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
#
# FloatField
# 一个浮点数. 必须 提供两个 参数:
#
# 参数    描述
# max_digits    总位数(不包括小数点和符号)
# decimal_places    小数位数
# 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
#
# models.FloatField(..., max_digits=5, decimal_places=2)
# 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
#
# models.FloatField(..., max_digits=19, decimal_places=10)
# admin 用一个文本框(<input type="text">)表示该字段保存的数据.
#
# ImageField
# 类似 FileField, 不过要校验上传对象是否是一个合法图片.它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存.
#
# 该字段要求 Python Imaging Library.
#
# IntegerField
# 用于保存一个整数.
#
# admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)
#
# IPAddressField
# 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
#
# admin 用一个``<input type="text">``表示该字段保存的数据(一个单行编辑框)
#
# NullBooleanField
# 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField 加 null=True 选项.
#
# admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" 和 "No" ) 来表示这种字段数据.
#
# PhoneNumberField
# 一个带有合法美国风格电话号码校验的 CharField``(格式: ``XXX-XXX-XXXX).
# PositiveIntegerField
# 类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的....所以字段名字取得不太好,无符号整数就对了嘛).
# PositiveSmallIntegerField
# 类似 PositiveIntegerField, 取值范围较小(数据库相关)
# SlugField
# "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.它们通常用于URLs.
#
# 若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50. 在以前的 Django 版本,没有任何办法改变 50 这个长度.
#
# 这暗示了 db_index=True.
#
# 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-populate the slug, via JavaScript, in the object‘s admin form:
#
# models.SlugField(prepopulate_from=("pre_name", "name"))
# prepopulate_from 不接受 DateTimeFields.
#
# admin 用一个``<input type="text">``表示 SlugField 字段数据(一个单行编辑框)
#
# SmallIntegerField
# 类似 IntegerField, 不过只允许某个取值范围内的整数.(依赖数据库)
#
# TextField
# 一个容量很大的文本字段.
#
# admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).
#
# TimeField
# A time. Accepts the same auto-population options as DateField 和 DateTimeField.
#
# admin 用一个 <input type="text"> 文本框表示该字段保存的数据(附加一些JavaScript shortcuts).
#
# URLField
# 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应).
#
# admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)
#
# USStateField
# 一个两字母的美国州名缩写.
#
# admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)
#
# XMLField
# 一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema 的文件系统路径.

模型常用的字段类型以及参数

表的操作(增删改查):

1  增(create  save)

>>> from app01.models import *
>>> Author.objects.create(name=‘Alvin‘)
<Author: Alvin>
>>> AuthorDetail.objects.create(sex=False,email=‘[email protected]‘,address=‘bejing‘,birthday=‘1995-3-16‘,author_id=1)
<AuthorDetail: AuthorDetail object>
>>> pub=Publisher()
>>> pub.name=‘河大出版社‘
>>> pub.address=‘保定‘
>>> pub.city=‘保定‘
>>> pub.state_province=‘河北‘
>>> pub.country=‘China‘
>>> pub.website=‘http://www.beida.com‘
>>> pub.save()

注意:如果每次创建一个对象,想显示对应的raw sql,需要在settings加上日志记录部分:

LOGGING = {
#     ‘version‘: 1,
#     ‘disable_existing_loggers‘: False,
#     ‘handlers‘: {
#         ‘console‘:{
#             ‘level‘:‘DEBUG‘,
#             ‘class‘:‘logging.StreamHandler‘,
#         },
#     },
#     ‘loggers‘: {
#         ‘django.db.backends‘: {
#             ‘handlers‘: [‘console‘],
#             ‘propagate‘: True,
#             ‘level‘:‘DEBUG‘,
#         },
#     }
# }

那么如何创建存在一对多或多对多关系的一本书的信息呢?

>>> Book.objects.create(title=‘php‘,publisher=pub,publication_date=‘2017-7-7‘)
<Book: php>
>>> author1=Author.objects.get(id=1)
>>> author2=Author.objects.get(name=‘alvin‘)
>>> book=Book.objects.get(id=1)
>>> book.authors.add(author1,author1)
>>> book.authors.add(author1,author2)

2 改:

update和save方法

时间: 2024-10-29 19:06:30

django之数据库orm的相关文章

Django之 数据库ORM

一.ORM Django的 业务 少不了 跟数据库打交道,不然没有数据库保存一些数据将是一件很糟糕的事情.Django 对 数据库 支持原生的 SQL语句,但更好的对数据库支持,Django自己有一套对数据库操作的模块,在操作.性能.便捷上 有很好的提升.ORM,Object Relational Mapping,对象关系映射.从字面意思理解,面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据.很早就有人提出,关系也可以用对象表达,这样

django 操作数据库--orm(object relation mapping)---models

思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Entity Framework django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 三层架构 创建表 1.创建Model,之后可以根

Django入门 &#160; 数据库的ORM操作之一对多

Django对数据库的是通过ORM实现.什么叫做ORM呢?简单来说,我们通过sql语句查询一张表的所有数据的语句如下  select * from test.而Django中用到的表都是在models.py文件里定义.所以我们要查查询test表里的数据可以通过 test_obj = models.test.objects.all()来获取test表里所有数据的对象.再通过 test_obj.values()方法将每一行数据的里的各个字段以key和value的字典形式读取出来.这就叫ORM操作.

Django框架之数据库ORM框架

首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据.ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程. django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改

Django中的ORM进阶操作

Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. 对于ORM对数据库的基本操作前面model里已经有了介绍,这里专门针对ORM的一对多.多对多.正向.反向等操作来讲解用法和注意事项. 铭记于心的两条: 在联表操作过滤查找数据时用双下划线 "__" 在取数据时用点 "." 一.一对多 首先来设计两张简单的表格,并在其中

Django之模型ORM

Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. ORM由来 让我们从O/R开始.字母O起源于"对象"(Object),而R则来自于"关系&qu

django下数据库配置

1.django默认支持sqlite.mysql.Oracle.postgresql数据库,像db2和sqlserver之类的数据库之类的数据库支持需要第三方的支持.具体详见:https://docs.djangoproject.com/en/1.9/ref/databases/ Using a 3rd-party database backend? In addition to the officially supported databases, there are backends pro

Django与数据库操作

Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接) Flask,tornado --- pymysql SQLArchemy (ORM) ORM 操作简单 (只把对象和类的操作 生成对应的sql语句) 创建,修改 数据表的时候简单 速度比原生的sql慢 -- 先转换成sql语句 原生sql执行会快 脚本运行Django的ORM操作数据库 import os,sys import django sys.path.ap

Django中的ORM 和入门基础

day62  2018-06-12 1. 内容回顾 1. web框架的本质 1. socket 浏览器: socket客户端 服务器: socket服务端 2. HTTP协议:规定了一个收发消息的格式 3. 消息分类 请求(request):浏览器向服务端发送的消息 GET /index/ HTTP/1.1\r\n k1:v1\r\n ...\r\n \r\n 请求体 响应(response): HTTP/1.1 200 OK\r\n k1:v1\r\n ...\r\n \r\n 响应体