概述
1.什么是ORM?
ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
2.ORM的优缺点是什么?
优点:摆脱复杂的SQL操作,适应快速开发;让数据结构变得简洁;数据库迁移成本更低(如从mysql->oracle)
缺点:性能较差、不适用于大型应用;复杂的SQL操作还需通过SQL语句实现
前期准备
1.创建django项目orm
2.创建app,test1
manage.py@orm > startapp test1
3.编辑settings.py
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'test1', )
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}
4.建表
1 #_*_coding:utf-8_*_ 2 from django.db import models 3 4 # Create your models here. 5 6 class Colors(models.Model): 7 colors=models.CharField(u'颜色',max_length=10) 8 def __unicode__(self): 9 return self.colors10 11 class Ball(models.Model): 12 color=models.OneToOneField("Colors") #与颜色表为一对一,颜色表为母表 13 description=models.CharField(u'描述',max_length=10) 14 def __unicode__(self): 15 return self.description 16 17 class Clothes(models.Model): 18 color=models.ForeignKey("Colors") #与颜色表为外键,颜色表为母表 19 description=models.CharField(u'描述',max_length=10) 20 def __unicode__(self): 21 return self.description 22 23 class Child(models.Model): 24 name=models.CharField(u'姓名',max_length=10) 25 favor=models.ManyToManyField('Colors') #与颜色表为多对多
from django.contrib import admin
from test1 import models# Register your models here. class ClothesAdmin(admin.ModelAdmin): list_display = ('description','color')admin.site.register(models.Colors)
admin.site.register(models.Ball)admin.site.register(models.Clothes,ClothesAdmin) #为了方便演示,我们让admin显示表的时候,显示2列(描述和颜色)admin.site.register(models.Child)manage.py@orm > makemigrations test1 #初始化表结构
manage.py@orm > migrate #表创建完毕
备注:我建立了4张表,并分别在admin中做了注册
Django-ORM
ORM有3种关联关系,分别为One-to-One(一对一),Many-to-Many(多对多),One-to-Many(一对多,也被称为外键)
先来区分一对一和一对多这是两种比较类似的关联关系,可以把一对一理解为一种特殊的一对多(多的一方外键为Unique)
先在colors表中创建了红黄蓝绿4种颜色
之后我们分别到ball表(onetoone)和clothes表(onetomany) 中创建几条数据试试看吧。
Ball表(一对一演示):
先创建一个红球,没问题
再创建一个红球2,报错了
最后我们只能创建4个球,一个球一种颜色,无法再创建第五个球,这就是OnetoOne
Clothes表(外键演示):
先创建一件红色内裤,没有问题,之后我们再创建一件红内衣,竟然也成功了
这就是一对一和一对多的区别所在:
一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据
一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择
共同点是在admin中添加数据的话,都会出现一个select选框,但只能单选,因为不论一对一还是一对多,自己都是“一”
多对多child表(与colors表多对多):
添加了3个小朋友
每个小朋友都有自己喜欢的颜色,老王喜欢绿色,丫蛋喜欢黄色和蓝色
总结多对多:
每个孩子可以喜欢多种颜色,一种颜色可以被多个孩子喜欢,对于双向均是可以有多个选择
简单来说,在admin中出现的是复选框
创建多对多之后,django会自动新增第三张表,用于记录2张表的对应关系
#记录了2张表的关联关系
应用场景
说了这么多了,这3种对应关系到底常见于哪些场景呢?
一对一:一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询
外键:有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工
多对多:如很多公司,一台服务器可能会有多种用途,归属于多个产品线当中,那么服务器与产品线之间就可以做成对多对,多对多在A表添加manytomany字段或者从B表添加,效果一致
相关文章