【django学习-15】ORM简介与数据表操作
作者:互联网
-
ORM概念:对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
-
ORM优缺点:
- 优点:
- 1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。
- 2 可以避免一些新手程序猿写sql语句带来的性能问题。
- 缺点:
- 1 性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。
- 2 对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。
- 3 通过QuerySet的query属性查询对应操作的sql语句
- 优点:
-
下面要开始学习Django ORM语法了,为了更好的理解,我们来做一个基本的 书籍/作者/出版商 数据库结构。 我们这样做是因为 这是一个众所周知的例子,很多SQL有关的书籍也常用这个举例。
-
表(模型)的创建:
- 实例:我们来假定下面这些概念,字段和关系
- 作者模型:一个作者有姓名。
- 作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。
- 出版商模型:出版商有名称,地址,所在城市,省,国家和网站。
- 书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。
from django.db import models<br>
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
-
代码分析
- <1>每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。
- <2> 每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。
- <3> 模型之间的三种关系:一对一,一对多,多对多。
- 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
- 一对多:就是主外键关系;(foreign key)
- 多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)
-
综上所述,模型之间的关联由OneToOneField,ForeignKey,ManyToManyField外键字段实现的,每个字段设有特殊的参数,参数说明如下:
to :必须参数,关联的模型名称
on_delete:必须参数,设置数据的删除模式,删除模型包括:CASCADE,PROTECT,SET_NULL,SET_DEFAULT,SET和DO_NOTHING
limit_choices_to:设置外键额下拉框选项,用于模型表单和Admin后台系统
related_name:用于模型之间的关联查询,如反向查询
related_query_name:设置模型的查询名称,用于filter和get查询,若设置related_name参数,则以该参数为默认值;如果没有设置,则以模型名称的小写为默认值;
to_field:设置外键与其它模型字段的关联性,默认关联主键;
db_constraint:在数据库里是否创建外键约束,默认True;
swappable:设置关联模型的替换功能;
symmetrical:仅限于ManyToManyField,设置多对多字段之间的对称模式;
through:仅限于ManyToManyField,设置自定义模型C,用于关联和创建模型A和模型B的多对多关系;
through_fields:仅限于ManyToManyField,设置模型C的字段,确认模型C哪些字段用于管理模型A和模型B的多对多关系;
db_table:仅限于ManyToManyField,为管理和存储多对多关系的数据表设置名称。
标签:15,name,models,max,模型,django,数据表,length,ORM 来源: https://www.cnblogs.com/xwltest/p/16694602.html