91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django的ContentType怎么使用

發布時間:2021-12-27 10:05:57 來源:億速云 閱讀:121 作者:iii 欄目:大數據

本篇內容主要講解“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怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瑞丽市| 洛南县| 和政县| 永兴县| 华阴市| 岳西县| 醴陵市| 广水市| 甘谷县| 湖口县| 融水| 西城区| 赣榆县| 桐城市| 静海县| 神农架林区| 宜君县| 内丘县| 方山县| 绵阳市| 迭部县| 昂仁县| 报价| 顺平县| 楚雄市| 闸北区| 荥经县| 紫金县| 东明县| 周宁县| 上饶市| 云南省| 易门县| 怀柔区| 滨海县| 锡林郭勒盟| 灵山县| 安吉县| 玛沁县| 炉霍县| 浏阳市|