django orm

您可能听说过Django ,它是Python Web框架,用于“有期限的完美主义者”。 就是那个可爱的小马 。

Django最强大的功能之一是其对象关系映射器(Object-Relational Mapper,ORM),它使您能够与数据库进行交互,就像使用SQL一样。 实际上,Django的ORM只是创建SQL来查询和操作数据库并以pythonic方式获取结果的一种Python方式。 好吧,我只是说一种方法,但实际上是真正聪明的工程,它利用Python的一些更复杂的部分来使开发人员的生活更轻松。

在开始研究ORM的工作方式之前,我们需要一个数据库来进行操作。 与任何关系数据库一样,我们需要定义一堆表及其关系(即它们之间的关联方式)。 让我们使用一些熟悉的东西。 例如,假设我们要建模一个包含博客文章和作者的博客。 作者有名字。 作者可以有许多博客文章。 博客文章可以有很多作者,并且具有标题,内容和发布日期。

在Django-ville中,这种帖子和作者的概念可以称为我们的Blog应用。 在这种情况下,应用程序是一组独立的模型和视图,描述了我们博客的行为和功能。 以正确的方式打包,许多Django项目都可以使用我们的Blog应用。 在我们的项目中,博客可能只是一个应用程序。 例如,我们可能还会有一个论坛应用程序。 但是我们会坚持使用Blog应用程序的原始范围。

这是为本教程准备的models.py

from django. db import models

class Author ( models. Model ) :
name = models. CharField ( max_length = 100 )

def __str__ ( self ) :
return self . name

class Post ( models. Model ) :
title = models. CharField ( max_length = 100 )
content = models. TextField ( )
published_date = models. DateTimeField ( blank = True , null = True )
author = models. ManyToManyField ( Author , related_name = "posts" )

def __str__ ( self ) :
return self . title

 

DateTimeField用于发布日期和时间。 Post还有一个ManyToManyField ,它将帖子和作者链接在一起。

大多数教程都是从头开始的,但实际上并非如此。 实际上,您将获得一堆现有的代码,例如上面的model.py ,您必须弄清楚这一切的含义。

因此,现在进入应用程序并进行浏览是您的任务。 有几种方法可以做到这一点。 您可以登录Django admin ,这是一个基于Web的后端,其中列出了所有应用程序以及操作它们的方式。 我们将回到这一点; 在这里,我们对ORM感兴趣。

我们可以通过从Django项目的主目录运行python manage.py shell来访问ORM。

/srv/web/django/ $ python manage. py shell

Python 3.6.3 ( default , Nov  9 2017 , 15 : 58 : 30 )
[ GCC 4.2.1 Compatible Apple LLVM 9.0.0 ( clang-900.0.38 ) ] on darwin
Type "help" , "copyright" , "credits" or "license" for more information.
( InteractiveConsole )
>>>


这将使我们进入交互式控制台。 shell命令为我们做了很多设置,包括导入我们的设置和配置Django环境。 启动外壳程序后,在导入外壳程序之前无法访问我们的Blog模型。


>>> from blog. models import * 

这将导入所有博客模型,以便我们可以处理我们的博客文章和作者。

首先,让我们获取所有作者的列表。


>>> Author. objects . all ( ) 

从该命令中得到的是结果的QuerySet ,其中列出了我们所有的Author对象。 我们也不会填充整个控制台,因为如果有很多结果,Django将自动截断打印结果。

>>> Author. objects . all ( )
< QuerySet [ < Author: VM ( Vicky ) Brasseur >, < Author: Rikki Endsley >,
< Author: Jen Wike Huger >, '...(remaining elements truncated)...' ]

我们可以使用get而不是all选择一个作者。 但是我们需要更多信息才能get一条记录。 在关系数据库中,表具有一个主键字段,该主键字段对表中的每个记录都有唯一的标识符; 但是,作者姓名不是唯一的。 许多人使用相同的名称 ,因此这并不是一个很好的唯一约束。 解决此问题的一种方法是使用序列(1、2、3 ...)或通用唯一标识符(UUID)作为主键。 但是由于这些不能很好地被人类使用,因此我们可以使用name来操纵Author对象。

>>> Author. objects . get ( name = "VM (Vicky) Brasseur" )
< Author: VM ( Vicky ) Brasseur >

这次,我们有一个可以与之交互的对象,而不是QuerySet列表。 我们可以使用任何表列作为属性来查看该对象,从而与该对象进行Python交互。

>>> vmb = Author. objects . get ( name = "VM (Vicky) Brasseur" )
>>> vmb. name
u 'VM (Vicky) Brasseur'

这就是很酷的事情发生的地方。 通常,在关系数据库中,如果要显示其他表的信息,则需要编写LEFT JOIN或其他表耦合函数,以确保我们的外键在表之间匹配。 Django会为我们解决这个问题。

在我们的模型中,作者编写了许多帖子,因此我们的Author对象可以检查作者发表了哪些帖子。

>>> vmb. posts . all ( )
QuerySet [ < Post: "7 tips for nailing your job interview" >,
< Post: "5 tips for getting the biggest bang for your cover letter buck" >,
< Post: "Quit making these 10 common resume mistakes" >,
'...(remaining elements truncated)...' ]

我们可以使用常规的pythonic列表操作来操作QuerySets 。

>>> for post in vmb. posts . all ( ) :
...   print ( post. title )
...
7 tips for nailing your job interview
5 tips for getting the biggest bang for your cover letter buck
Quit making these 10 common resume mistakes

要进行更复杂的查询,我们可以使用过滤器而不是获取所有内容。 这是棘手的地方。 在SQL中,您可以使用诸如like , contains和其他过滤对象之类的选项。 您也可以在ORM中完成所有这些操作,但是它有一种特殊的处理方式:通过使用隐式(而非显式)定义的函数。

如果我在Python脚本中调用函数do_thing() ,我希望在某个地方会有匹配的def do_thing 。 这是一个明确的功能定义。 但是,在ORM中,您可以调用未明确定义的函数。 以前,我们使用name来匹配名称。 但是,如果我们想进行子字符串搜索,则可以使用name__contains

>>> Author. objects . filter ( name__contains = "Vic" )
QuerySet [ < Author: VM ( Vicky ) Brasseur >, < Author: Victor Hugo ">]

现在,关于双下划线( __ )的小注释。 这些都是非常的Python。 您可能已经看到__main____repr__在Pythonland您的旅行。 这些有时称为dunder methods ,是“双下划线”的缩写。 Python的对象名称中只能使用少数几个非字母数字字符。 下划线是其中之一。 这些在ORM中用作过滤器键名不同部分的显式分隔符。 在底层,字符串被这些下划线分隔,并且标记被单独处理。 name__contains更改为attribute: name, filter: contains 。 在其他编程语言中,您可以改用箭头,例如PHP中的name->contains 。 不要让雷声吓scar您,它们只是pythonic的助手! (如果您斜视,您可以说它们看起来像小蛇,小Python,希望对您的代码有所帮助。)

ORM非常强大且非常Python化。 但是我上面提到的那个Django管理网站呢?

Django出色的用户可访问性功能之一是其管理界面。 如果定义模型,则将免费获得一个基于Web的漂亮编辑门户。

以及什么力量呢? ORM。

那就对了! 给定用于创建原始模型的代码,Django将其转换为基于Web的门户,该门户使用与之前使用的原始函数相同的功能。 默认情况下,管理员是基本的,但这只是在模型中添加更多定义以更改管理员外观的问题。 例如,以前的__str__方法? 我们使用它们来定义Author对象的外观(在这种情况下,仅是作者的名称)。 通过一些工作,您可以使界面看起来像一个完整的内容管理系统,使您的用户可以轻松地编辑自己的内容(例如,添加字段和过滤器以标记帖子为“已发布”)。

如果您想了解更多信息,有关ORM的Django Girls教程部分提供了详细的演练。 Django项目网站上也有很多文档。

翻译自: https://opensource.com/article/17/11/django-orm

django orm

django orm_Django ORM简介相关推荐

  1. Django之ORM简介

    读万卷书,行万里路.--刘彝 文章目录 Django之ORM简介 一.MVC与MTV模型 1.MVC模型 2. MTV模型 Django模型 二 .ORM简介 1.什么是ORM 2.使用ORM的好处: ...

  2. Django 学习 之ORM简介与单表操作

    一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...

  3. python增删改查的框架_python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查...

    Django中的ORM简介 ORM概念:对象关系映射(Object Relational Mapping,简称ORM): 用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够 ...

  4. [转]Django REST framework 简介与中文教程

    Django REST framework 简介与中文教程 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 在开发REST AP ...

  5. Django中ORM操作

    一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. ​ 简单的说,ORM是通过使用描述对象 ...

  6. Django 之ORM(一)

    1.orm简介 对象关系映射(Object Relational Mapping, 简称ORM) 简言之,ORM是通过使用描述对象和数据库之间映射的源数据,将程序中的对象自动持久化到关系数据库中. O ...

  7. Django之ORM和单表操作

    ORM简介 ORM是"对象-关系-映射"的简称.(Object Relational Mapping,简称ORM) 类对象--->sql--->pymysql---&g ...

  8. django mysql orm教程_带你了解Django ORM操作(基础篇)

    前言 在日常开发中,需要大量对数据库进行增删改查操作. 如果头铁的话,使用原生SQL是最好的,毕竟性能又高,又灵活. 但是通常情况下,我们不是太需要那么苛刻的性能,也没有那么多刁钻的需求用原生SQL ...

  9. Django 数据库ORM 操作 - 字段的类型和参数

    通过Django的ORM创建表的时候,我们需要定义自己的类. 定义类的时候,他有各种各样的字段类型,每个字段都有自己的参数可以进行配置,下面简单的归纳一下. 首先看看字段的类型.尽管Python提供了 ...

最新文章

  1. 关于Blocking IO, Non-Blocking IO 和 Asynchronous I/O的理解
  2. 数据库被黑后留下的数据
  3. linux mysql 权限设置_Linux下mysql新建账号及权限设置
  4. CAMWorks ShopFloor 2020中文版
  5. jquery 流程图_使用 JQuery.Flowchart
  6. 【笔记】windows10安装linux双系统教程(可能是现今最简单方法)
  7. 【超经典】Java多态有什么好处?怎样用?
  8. Android Wear 唤醒热词会比“你好,安卓”好吗?
  9. robomaster裁判系统服务器,2018裁判系统调试组网完全攻略
  10. linux之Vim用快捷键快速移动光标至行首和行尾
  11. 【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)
  12. 数字图像处理-0.绪论
  13. PHPWeb开发入门体验学习笔记
  14. 设计灵感|展览海报的设计没有头绪?
  15. cnocr:用来做中文OCR的Python3包,装上就能用!
  16. Python3 语法之函数思维导图
  17. 微信H5页面前端开发,大多数人都会遇到的几个兼容性坑
  18. 华为od与中软外包哪个更好_真惨!入职中软一个月(外包华为)就离职了~
  19. 冠军方案解读 | nnUNet改进提升笔记
  20. O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)

热门文章

  1. 深入理解redis中的lua脚本
  2. 正则基础之——非捕获组
  3. Logback.xml 文件    配置
  4. java static 在java 中的使用。
  5. Ruby对象、变量和常量
  6. [设计模式] 17 中介者模式 Mediator Pattern
  7. 【平面设计】扁平化设计(Ⅲ)——原则
  8. linux改变文件所属用户和组
  9. CSDN上传资源时一直提示 请填写资源tag
  10. 使用Xamarin.Forms的企业应用程序模式(电子书)--访问远程数据