ORM语法[对象关系映射]

ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作。

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

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

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

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

3  通过QuerySet的query属性查询对应操作的sql语句

              author_obj=models.Author.objects.filter(id=2)

print(author_obj.query)

创建表[class类创建表]:

一对一: OnetoOne

一对多: ForeignKey[外键在多的那个类/表中]

多对多: Manytomany

ORM操作

创建表[class类创建表]:
    一对一: OnetoOne
    一对多: ForeignKey[外键在多的那个类/表中]
    多对多: Manytomany
操作表[行对象]:
    增:
        create: 
            单表增加1
                    models.Book.objects.create(name='FTL')
            单表增加2【推荐】
                    dict={'name':'FTL'}
                         models.Book.objects.create(**dict)  # 接收传递过来的字典
            一对多表增加1【外键publish】
                    models.Book.objects.create(name='FTL', publish_id=2) # 直接添加id
            一对多表增加2【外键publish,推荐根据对象添加】
                    publisher=models.Publish.objects.get(id=2)
                    # 添加单个对象,非集合【否则就变成了多对多】
                    models.Book.objects.create(name='FTL', publish=publisher)
               多对多【推荐对象添加】
                    publisher=models.Publish.objects.get(id=2)
                    publisher1=models.Publish.objects.get(id=3)
                    book=models.Book.objects.get(id=2)
                    book.add(publish,publish1)
                    或者方向添加: author.book_setadd(*books) [books是列表]
        save:
            单表创建1、book = Book(name='FTL')
                          book.save();
            单表创建2、book = Book()
                          obj.name='FTL'
                          ojb.save()
               多表创建同上create()
   删: delete, remove, clear
    改: update, save
    查:filter, get

创建表模型:

/blog/models.py

# --------------------------------ORM学习------------------------
from django.db import models
class Publish(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField('名称', max_length=64)
city = models.CharField('所在城市', max_length=64)
province = models.CharField('省份', max_length=30, default='BJ')
country = models.CharField('国家', max_length=33, default='CHINA')
website = models.CharField('网址', max_length=30, default="WWW")
class Meta:
verbose_name='出版社'
verbose_name_plural = verbose_name # plural 复数的
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('邮箱', max_length=12)
birthday = models.DateField()
author = models.OneToOneField(Author,on_delete=models.CASCADE,) class Book(models.Model):
title = models.CharField(max_length=64, verbose_name="标题")
price = models.DecimalField(max_digits=5, decimal_places=2, default=10)
page_num = models.IntegerField(null=True,editable=False) # Djangog默认可修改
# 注意是添加了引号的类,如果不添加,则需要把类放在该类的前面[否则Py解释器找不到]
author = models.ManyToManyField('Author', default='FTL') # 1本书有多个作者
# author = models.ManyToManyField(Author, default='FTL') # Author类必须在Book之前
#外键属性,django在创建表单时候会默认将publish改为publish_id[外键在多的那一方创建]
publish = models.ForeignKey('Publish', on_delete=models.CASCADE, default=1,)
publish_date = models.DateField(default='2020-20-20')
def __str__(self):
return self.title

执行命令,创建表单:

python manage.py makemigrations  # 会在blog下migrations文件夹下生成一个Python文件
# F:\Django\mysite2\blog\migrations\auto_20180125_0737.py
pytyon manage.py migrate # 真正去数据库里面创建表

建表成功:

分析代码:
  <1>  每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。
  <2>  每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。
  <3>  模型之间的三种关系:一对一,一对多,多对多。
一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
一对多:就是主外键关系;(foreign key)
多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)

问题解决

遇到的问题1:

问题现象:表字段无默认值报错,建表失败

问题解决: 添加属性默认值,Py3新增加

遇到的问题2:

问题现象:外键没有设置级联删除,建表失败

问题解决: 添加级联删除,on_delete=models.CASCADE,

Python学习---django之ORM语法[对象关系映射]180124的更多相关文章

  1. Django——Django中的QuerySet API 与ORM(对象关系映射)

    首先名词解释. ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型 ...

  2. ORM即 对象-关系映射(转自:微冷的雨)

    ORM即 对象-关系映射: 将数据库中的数据关系表,映射为实体对象. 灵动思绪EF(Entity FrameWork) 作者: 微冷的雨  来源: 博客园  发布时间: 2013-01-22 16:2 ...

  3. [Python之路] ORM(对象关系映射)

    一.概念 ORM是Python后端Web框架Django的核心思想,"Object Relational Mapping",即对象-关系映射,简称ORM. 一句话理解就是: 创建一 ...

  4. 优酷项目之 ORM(数据库对象关系映射)代码重写

    前言: 我们在操作数据库时候一般都是通过sql代码来操作mysql数据库中相关数据,这就需要懂得sql语句,那么怎么样才能在不懂sql语句的情况下通过我们所学的python代码来实现对mysql数据库 ...

  5. ORM框架(对象关系映射)

    Entity Framework 学习初级篇1--EF基本概况 http://www.cnblogs.com/xray2005/archive/2009/05/07/1452033.html ORM  ...

  6. 【python】-- Django路由系统(网址关系映射)、视图、模板

    Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...

  7. ORM概述(对象关系映射)

    ORM概述: ORM(Object-Relational Mapping)表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到加你对象与数据库 ...

  8. Python学习---django之Model语法180124

    django之Model语法[Models] 1    django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使 ...

  9. Python学习---django之ORM的增删改查180125

    模型常用的字段类型参数 <1> CharField        #字符串字段, 用于较短的字符串.        #CharField 要求必须有一个参数 maxlength, 用于从数 ...

随机推荐

  1. git提交代码到远程仓库

    1.仓库初始化 git init 2.连接仓库 git remote add origin 仓库地址 3.查看状态 git status 4.将文件添加到暂存区 git add 状态里的新文件 5.将 ...

  2. PHP之string之addcslashes()函数使用

    addcslashes (PHP 4, PHP 5, PHP 7) addcslashes - Quote string with slashes in a C style addcslashes - ...

  3. Redis之数据类型Sting字符串

    Redis String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value. string类型是二进制安全的.意思是redi ...

  4. 开源高性能网络库Libevent的简介

    Libevent是什么? Libevent 是一个用C语言编写的.轻量级的开源高性能网络库. 官网:http://libevent.org/ 优点: (1)事件驱动,高性能 (2)轻量级,专注于网络 ...

  5. 如何花二十分钟使用Hexo搭建个人博客

    前提条件: 你必须得有一个github账户 你的电脑上要安装了git和nodejs 你也可以达到这样的效果:https://liubinpy.github.io/ 第一步 进入一个你觉得比较安全的目录 ...

  6. [转]asp.net权限认证:摘要认证(digest authentication)

    本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密 ...

  7. 京东-Java开发工程师-一面

    时间:2017-4-7 16:47 时长:32分19秒 类型:笔试前电话面试 之前打过一个电话过来说了一声,下午就直接打过来面试了,没有自我介绍貌似 1. 你做的这些东西是什么样的? 2. 选一个你觉 ...

  8. 【转载】SQL Server 2012将数据导出为脚本详细图解

    前记: 从SQL SERVER 2008开始,我们就可以很方便的导出数据脚本,而无需再借助存储过程,但是SQL Server 2012和SQL Server 2008的导出脚本的过程还有一点细微的差别 ...

  9. [javaSE] 数据结构(AVL树基本概念)

    AVL树是高度平衡的二叉树,任何节点的两个子树的高度差别<=1 实现AVL树 定义一个AVL树,AVLTree,定义AVLTree的节点内部类AVLNode,节点包含以下特性: 1.key——关 ...

  10. 使用jQuery的validation插件实现表单校验

    前端表单校验: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...