簡(jiǎn)單了解Django ContentType內(nèi)置組件
一、引出問(wèn)題
假如有這兩張表,它們中的課程可能價(jià)格不一樣、周期不一樣、等等...不一樣...,現(xiàn)在有一張價(jià)格策略表,怎么就用一張表報(bào)保存它們之間不同的數(shù)據(jù)呢?
可能你會(huì)這樣:
確實(shí)是行!但是,如果有很多不同類型的課程,那么這樣表就太多空值了!
沒(méi)辦法,這一張表不行,再創(chuàng)建一張不就行了,就像這樣:
確實(shí),對(duì)于這種情況,Django就是這樣做的。
現(xiàn)在,有了 ContentType,我們只需創(chuàng)建三張表,就實(shí)現(xiàn)跟上面的效果一模一樣了。
這是因?yàn)?Django 本身就會(huì)新建 django_content_type 這張表,這張表就保存了 model 中的表名。
二、ContentType
那么怎么創(chuàng)建這種關(guān)系呢?如下:
這里,DegreeCourse 表沒(méi)有使用 GenericRelation,則不能使用下面說(shuō)的第3點(diǎn),否則報(bào)錯(cuò),要想使用就跟 Course 表一樣添加即可。
對(duì)于 GenericRelation 和 GenericForeignKey 類型字段,不會(huì)在數(shù)據(jù)庫(kù)生成列!
三、測(cè)試
# views.py from django.shortcuts import HttpResponse from django.contrib.contenttypes.models import ContentType from appxx import models
1、在價(jià)格策略表中添加一條數(shù)據(jù)。
# 方式1 def test(request): models.PricePolicy.objects.create( price=100, valid_period=7, object_id=3, content_type=ContentType.objects.get(model="course") ) return HttpResponse("ok")
# 方式2 def test(request): models.PricePolicy.objects.create( price=200, valid_period=14, content_object=models.Course.objects.get(id=3) # 對(duì)應(yīng)Course表id為3的價(jià)格策略 # content_object=models.DegreeCourse.objects.get(id=2) # 對(duì)應(yīng)DegreeCourse表id為2的價(jià)格策略 ) return HttpResponse("ok")
2、 根據(jù)某個(gè)價(jià)格策略對(duì)象,找到對(duì)應(yīng)的表和數(shù)據(jù)。(是根據(jù) GenericForeignKey類型字段實(shí)現(xiàn)的)
def test(request): obj = models.PricePolicy.objects.get(id=1) print(obj.content_object.id, obj.content_object.name) # 自動(dòng)找到 return HttpResponse("ok")
3、 找到某個(gè)課程關(guān)聯(lián)的所有價(jià)格策略。(是根據(jù) GenericRelation 類型字段實(shí)現(xiàn)的)
def test(request): obj = models.Course.objects.get(id=1) for item in obj.policy_list.all(): print(item.id, item.price, item.valid_period) return HttpResponse("ok")
關(guān)系圖:
四、總結(jié)
什么時(shí)候才用ContentType?
當(dāng)一張表跟 n 張表動(dòng)態(tài)地創(chuàng)建 ForeignKey 關(guān)系時(shí),而不是創(chuàng)建太多列,因?yàn)閿?shù)據(jù)表中會(huì)有很多空值。
ContentType 通過(guò)僅兩列字段就實(shí)現(xiàn)了 n 張表的 ForeignKey 關(guān)系。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
全面了解Nginx, WSGI, Flask之間的關(guān)系
下面小編就為大家分享一篇全面了解Nginx, WSGI, Flask之間的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

一文帶你掌握Pyecharts地理數(shù)據(jù)可視化的方法

Python的Flask框架中實(shí)現(xiàn)登錄用戶的個(gè)人資料和頭像的教程

總結(jié)的幾個(gè)Python函數(shù)方法設(shè)計(jì)原則

python如何使用pywebview打造一個(gè)現(xiàn)代化的可視化GUI界面詳解

python2 與python3的print區(qū)別小結(jié)

初探利用Python進(jìn)行圖文識(shí)別(OCR)

Python利用arcpy模塊實(shí)現(xiàn)柵格的創(chuàng)建與拼接

python?selenium.webdriver?爬取政策文件的實(shí)現(xiàn)