您好,登錄后才能下訂單哦!
本篇內容主要講解“Django的ContentType怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Django的ContentType怎么使用”吧!
contenttypes 是Django內置的一個應用,可以追蹤項目中所有app和model的對應關系,并記錄在ContentType表中。
那么這個表有什么作用呢?這里提供一個場景,網上商城購物時,會有各種各樣的優惠券,比如通用優惠券,滿減券,或者是僅限特定品類的優惠券。在數據庫中,可以通過外鍵將優惠券和不同品類的商品表關聯起來:
from django.db import models
class Electrics(models.Model):
"""
id name
1 日立冰箱
2 三星電視
3 小天鵝洗衣機
"""
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): # 特殊關系表
"""
id name electric_id food_id cloth_id more... # 每增加一張表,關系表的結構就要多加一個字段。
1 通用優惠券 null null null
2 冰箱滿減券 2 null null
3 面包狂歡節 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)
如果是通用優惠券,那么所有的ForeignKey為null,如果僅限某些商品,那么對應商品ForeignKey記錄該商品的id,不相關的記錄為null。但是這樣做是有問題的:實際中商品品類繁多,而且很可能還會持續增加,那么優惠券表中的外鍵將越來越多,但是每條記錄僅使用其中的一個或某幾個外鍵字段。
contenttypes 應用
通過使用contenttypes 應用中提供的特殊字段GenericForeignKey,我們可以很好的解決這個問題。只需要以下三步:
在model中定義ForeignKey字段,并關聯到ContentType表。通常這個字段命名為“content_type”
在model中定義PositiveIntegerField字段,用來存儲關聯表中的主鍵。通常這個字段命名為“object_id”
在model中定義GenericForeignKey字段,傳入上述兩個字段的名字。
為了更方便查詢商品的優惠券,我們還可以在商品類中通過GenericRelation字段定義反向關系。
示例代碼:
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') # 用于反向查詢,不會生成表字段
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
美的滿減優惠券 9(電器表electrics) 3
豬蹄買一送一優惠券 10 2
南極被子買200減50優惠券 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只運用于1對多的關系!!!并且多的那張表中有多個ForeignKey字段。
到此,相信大家對“Django的ContentType怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。