概述
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
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表添加,效果一致
相關文章
【原創】Django-ORM進階