【原创】Django-ORM基础

时间:2021-10-08 05:35:22

概述

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.colors
10
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基础

Django-ORM

ORM有3种关联关系,分别为One-to-One(一对一),Many-to-Many(多对多),One-to-Many(一对多,也被称为外键)

先来区分一对一和一对多

这是两种比较类似的关联关系,可以把一对一理解为一种特殊的一对多(多的一方外键为Unique)

【原创】Django-ORM基础先在colors表中创建了红黄蓝绿4种颜色

之后我们分别到ball表(onetoone)和clothes表(onetomany) 中创建几条数据试试看吧。

Ball表(一对一演示):

先创建一个红球,没问题

【原创】Django-ORM基础

再创建一个红球2,报错了

【原创】Django-ORM基础

最后我们只能创建4个球,一个球一种颜色,无法再创建第五个球,这就是OnetoOne

【原创】Django-ORM基础

Clothes表(外键演示):

先创建一件红色内裤,没有问题,之后我们再创建一件红内衣,竟然也成功了

【原创】Django-ORM基础

这就是一对一和一对多的区别所在:

一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据

一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择

共同点是在admin中添加数据的话,都会出现一个select选框,但只能单选,因为不论一对一还是一对多,自己都是“一”

【原创】Django-ORM基础

多对多

child表(与colors表多对多):

添加了3个小朋友

【原创】Django-ORM基础

每个小朋友都有自己喜欢的颜色,老王喜欢绿色,丫蛋喜欢黄色和蓝色

【原创】Django-ORM基础

总结多对多:

每个孩子可以喜欢多种颜色,一种颜色可以被多个孩子喜欢,对于双向均是可以有多个选择

简单来说,在admin中出现的是复选框

【原创】Django-ORM基础

创建多对多之后,django会自动新增第三张表,用于记录2张表的对应关系

【原创】Django-ORM基础

【原创】Django-ORM基础  #记录了2张表的关联关系

应用场景

说了这么多了,这3种对应关系到底常见于哪些场景呢?

一对一:一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询

外键:有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工

多对多:如很多公司,一台服务器可能会有多种用途,归属于多个产品线当中,那么服务器与产品线之间就可以做成对多对,多对多在A表添加manytomany字段或者从B表添加,效果一致

相关文章

【原创】Django-ORM进阶