溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django的ContentType怎么使用

發(fā)布時(shí)間:2021-12-27 10:05:57 來(lái)源:億速云 閱讀:119 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Django的ContentType怎么使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Django的ContentType怎么使用”吧!

contenttypes 是Django內(nèi)置的一個(gè)應(yīng)用,可以追蹤項(xiàng)目中所有app和model的對(duì)應(yīng)關(guān)系,并記錄在ContentType表中。 

那么這個(gè)表有什么作用呢?這里提供一個(gè)場(chǎng)景,網(wǎng)上商城購(gòu)物時(shí),會(huì)有各種各樣的優(yōu)惠券,比如通用優(yōu)惠券,滿減券,或者是僅限特定品類的優(yōu)惠券。在數(shù)據(jù)庫(kù)中,可以通過(guò)外鍵將優(yōu)惠券和不同品類的商品表關(guān)聯(lián)起來(lái):

from django.db import models

class Electrics(models.Model):
"""
id name
1 日立冰箱
2 三星電視
3 小天鵝洗衣機(jī)
"""
name = models.CharField(max_length=32)


class Foods(models.Model):
"""
id name
1 面包
2 烤鴨
"""
name = models.CharField(max_length=32)


class Clothes(models.Model):
name = models.CharField(max_length=32)


class Coupon(models.Model): # 特殊關(guān)系表
"""
  id name    electric_id   food_id cloth_id more... # 每增加一張表,關(guān)系表的結(jié)構(gòu)就要多加一個(gè)字段。
1 通用優(yōu)惠券   null       null null
2 冰箱滿減券   2         null    null
3 面包狂歡節(jié)   null       1      null
"""
name = models.CharField(max_length=32)
electric = models.ForeignKey(to='Electrics', null=True)
food = models.ForeignKey(to='Foods', null=True)
cloth = models.ForeignKey(to='Clothes', null=True)
 如果是通用優(yōu)惠券,那么所有的ForeignKey為null,如果僅限某些商品,那么對(duì)應(yīng)商品ForeignKey記錄該商品的id,不相關(guān)的記錄為null。但是這樣做是有問(wèn)題的:實(shí)際中商品品類繁多,而且很可能還會(huì)持續(xù)增加,那么優(yōu)惠券表中的外鍵將越來(lái)越多,但是每條記錄僅使用其中的一個(gè)或某幾個(gè)外鍵字段。

contenttypes 應(yīng)用

通過(guò)使用contenttypes 應(yīng)用中提供的特殊字段GenericForeignKey,我們可以很好的解決這個(gè)問(wèn)題。只需要以下三步:  

在model中定義ForeignKey字段,并關(guān)聯(lián)到ContentType表。通常這個(gè)字段命名為“content_type”

在model中定義PositiveIntegerField字段,用來(lái)存儲(chǔ)關(guān)聯(lián)表中的主鍵。通常這個(gè)字段命名為“object_id”

在model中定義GenericForeignKey字段,傳入上述兩個(gè)字段的名字。

為了更方便查詢商品的優(yōu)惠券,我們還可以在商品類中通過(guò)GenericRelation字段定義反向關(guān)系。  

示例代碼:

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation


class Electrics(models.Model):
name = models.CharField(max_length=32)
price = models.IntegerField(default=100)
coupons = GenericRelation(to='Coupon') # 用于反向查詢,不會(huì)生成表字段

def __str__(self):
return self.name


class Foods(models.Model):
name = models.CharField(max_length=32)
price=models.IntegerField(default=100)
coupons = GenericRelation(to='Coupon')

def __str__(self):
return self.name


class Clothes(models.Model):
name = models.CharField(max_length=32)
price = models.IntegerField(default=100)
coupons = GenericRelation(to='Coupon')

def __str__(self):
return self.name


class bed(models.Model):
name = models.CharField(max_length=32)
price = models.IntegerField(default=100)
coupons = GenericRelation(to='Coupon')


class Coupon(models.Model):
"""
Coupon
id name content_type_id object_id_id
美的滿減優(yōu)惠券 9(電器表electrics) 3
豬蹄買一送一優(yōu)惠券 10 2
南極被子買200減50優(yōu)惠券 11 1
"""
name = models.CharField(max_length=32)

content_type = models.ForeignKey(to=ContentType) # step 1
object_id = models.PositiveIntegerField() # step 2
content_object = GenericForeignKey('content_type', 'object_id') # step 3

def __str__(self):
return self.name
注意:ContentType只運(yùn)用于1對(duì)多的關(guān)系?。?!并且多的那張表中有多個(gè)ForeignKey字段。  

到此,相信大家對(duì)“Django的ContentType怎么使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI