【原創】Django-ORM基礎


概述

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進階

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM