Django的Content-Type組件

一、需求

現(xiàn)在我們有這樣一個需求~我們的商城里有很多的商品揭蜒,節(jié)日要來了横浑,我們要搞活動。那么我們就要設(shè)計優(yōu)惠券屉更,優(yōu)惠券都有什么類型呢伪嫁,滿減的、折扣的偶垮、立減的。
我們對應(yīng)著我們活動類型,對我們的某類商品設(shè)計優(yōu)惠券似舵,比如:家電是一類商品脚猾、食物是一類商品。那么我們可以設(shè)計家電折扣優(yōu)惠券砚哗,以及食物滿減優(yōu)惠券等......
那么我們看表結(jié)構(gòu)怎么設(shè)計???
models.py

from django.db import models


class Appliance(models.Model):
   """
   家用電器表
   id name
   1   冰箱
   2   電視
   3   洗衣機(jī)
   """
   name = models.CharField(max_length=64)


class Food(models.Model):
   """
   食物表
   id name
   1  面包
   2  牛奶
   """
   name = models.CharField(max_length=32)


class Fruit(models.Model):
   """
   水果表
   id  name
   1   蘋果
   2   香蕉
   """
   name = models.CharField(max_length=32)


class Coupon(models.Model):
   """
   優(yōu)惠券表
   id  name    appliance_id    food_id     fruit_id
   1   通用優(yōu)惠券   null            null        null
   2   冰箱折扣券   1               null        null
   3   電視折扣券   2               null        null
   4   蘋果滿減卷   null            null        1
   我每增加一張表就要多增加一個字段
   """
   name = models.CharField(max_length=32)
   appliance = models.ForeignKey(to="Appliance", null=True, blank=True)
   food = models.ForeignKey(to="Food", null=True, blank=True)
   fruit = models.ForeignKey(to="Fruit", null=True, blank=True)

實(shí)際上我們商品的種類會特別的多龙助,導(dǎo)致我們這張表外鍵越來越多
遇到像Coupon這種一張表要跟多張表進(jìn)行外鍵關(guān)聯(lián)的時候~我們Django提供了ContentType組件

2、了解ContentType組件

  • ContentType是Django的內(nèi)置的一個應(yīng)用蛛芥,可以追蹤項目中所有的APP和model的對應(yīng)關(guān)系提鸟,并記錄在ContentType表中。
  • 當(dāng)我們的項目做數(shù)據(jù)遷移后仅淑,會有很多django自帶的表称勋,其中就有django_content_type表
ContentType組件應(yīng)用:
  • 在model中定義ForeignKey字段,并關(guān)聯(lián)到ContentType表涯竟,通常這個字段命名為content-type
  • 在model中定義PositiveIntergerField字段, 用來存儲關(guān)聯(lián)表中的主鍵赡鲜,通常我們用object_id
  • 在model中定義GenericForeignKey字段,傳入上面兩個字段的名字
  • 方便反向查詢可以定義GenericRelation字段

models.py

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

class Appliance(models.Model):
    """
    家用電器表
    id name
    1   冰箱
    2   電視
    3   洗衣機(jī)
    """
    name = models.CharField(max_length=64)
    coupons = GenericRelation(to="Coupon")

    def __str__(self):
        return self.name

class Food(models.Model):
    """
    食物表
    id name
    1  面包
    2  牛奶
    """
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

class Fruit(models.Model):
    """
    水果表
    id  name
    1   蘋果
    2   香蕉
    """
    name = models.CharField(max_length=32)

    def __str__(self):
        return self.name

class Coupon(models.Model):
    """
    優(yōu)惠券表
    id  name    appliance_id    food_id     fruit_id
    1   通用優(yōu)惠券   null            null        null
    2   冰箱折扣券   1               null        null
    3   電視折扣券   2               null        null
    4   蘋果滿減卷   null            null        1
    我每增加一張表就要多增加一個字段
    """
    name = models.CharField(max_length=32)
    # 第一步
    content_type = models.ForeignKey(to=ContentType)
    # 第二步
    object_id = models.PositiveIntegerField()
    # 第三步
    content_object = GenericForeignKey('content_type', 'object_id')

    def __str__(self):
        return self.name

view.py

from django.shortcuts import render, HttpResponse
from django import views
from app01 import models

class Text(views.View):

    def get(self, request):
        # 通過ContentType獲得表名
        content = models.ContentType.objects.filter(app_label="app01", model="appliance").first()
        # 獲得表model對象 相當(dāng)于models.Applicance
        model_class = content.model_class()
        obj_list = model_class.objects.all()

        # 創(chuàng)建:給電器的冰箱添加優(yōu)惠券
        # 第一步庐船,將想要添加優(yōu)惠券的對象取出
        obj = models.Appliance.objects.filter(pk=2).first()
        # 第二步银酬,創(chuàng)建優(yōu)惠券,傳入兩個參數(shù)name="冰箱優(yōu)惠券", content_object=obj
        models.Coupon.objects.create(name="冰箱優(yōu)惠券", content_object=obj)

        # 正向查詢:查詢優(yōu)惠券id=1綁定了哪個商品
        Coupon_obj = models.Coupon.objects.filter(pk=1).first()
        goods_obj = Coupon_obj.content_object
        print(goods_obj)

        # 反向查詢之定義了coupons = GenericRelation(to="Coupon")
        appliance_obj = models.Appliance.objects.filter(pk=2).first()
        results = appliance_obj.coupons.all()
        print(results)

        # 反向查詢之沒有定義coupons = GenericRelation(to="Coupon")
        result = models.Coupon.objects.filter(content_type=content, object_id=2)
        print(result)

        return HttpResponse("ok")
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筐钟,一起剝皮案震驚了整個濱河市揩瞪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篓冲,老刑警劉巖李破,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酝锅,死亡現(xiàn)場離奇詭異刚操,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)月褥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門瞭恰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屯曹,“玉大人,你說我怎么就攤上這事惊畏《竦ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵颜启,是天一觀的道長偷俭。 經(jīng)常有香客問我,道長缰盏,這世上最難降的妖魔是什么涌萤? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任淹遵,我火速辦了婚禮,結(jié)果婚禮上负溪,老公的妹妹穿的比我還像新娘透揣。我一直安慰自己,他們只是感情好川抡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布辐真。 她就那樣靜靜地躺著,像睡著了一般崖堤。 火紅的嫁衣襯著肌膚如雪侍咱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天密幔,我揣著相機(jī)與錄音楔脯,去河邊找鬼。 笑死老玛,一個胖子當(dāng)著我的面吹牛淤年,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜡豹,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼麸粮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了镜廉?” 一聲冷哼從身側(cè)響起弄诲,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娇唯,沒想到半個月后齐遵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塔插,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年梗摇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片想许。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡伶授,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出流纹,到底是詐尸還是另有隱情糜烹,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布漱凝,位于F島的核電站疮蹦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茸炒。R本人自食惡果不足惜愕乎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一阵苇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妆毕,春花似錦慎玖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湿硝。三九已至薪前,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間关斜,已是汗流浹背示括。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痢畜,地道東北人垛膝。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像丁稀,于是被迫代替她去往敵國和親吼拥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容