欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么在Django中使用contenttypes框架-創(chuàng)新互聯(lián)

本篇文章為大家展示了怎么在Django中使用contenttypes 框架,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

在冀州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè)公司,冀州網(wǎng)站建設(shè)費用合理。

一、什么是Django ContentTypes?

Django ContentTypes是由Django框架提供的一個核心功能,它對當前項目中所有基于Django驅(qū)動的model提供了更高層次的抽象接口。

二、Django ContentTypes做了什么?

當使用django-admin初始化一個django項目的時候,可以看到在默認的INSTALL_APPS已經(jīng)包含了django.contrib.contenttypes:

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

而且注意django.contrib.contenttypes是在django.contrib.auth之后,這是因為auth中的permission系統(tǒng)是根據(jù)contenttypes來實現(xiàn)的。

我們來查詢查閱了一下django.contrib.contenttypes.models文件:

class ContentType(models.Model):
  app_label = models.CharField(max_length=100)
  model = models.CharField(_('python model class name'), max_length=100)
  objects = ContentTypeManager()

  class Meta:
    verbose_name = _('content type')
    verbose_name_plural = _('content types')
    db_table = 'django_content_type'
    unique_together = (('app_label', 'model'),)

  def __str__(self):
    return self.name

大家可以看到ContentType就是一個簡單的django model,而且它在數(shù)據(jù)庫中的表的名字為django_content_type。

這個表的名字一般都不會陌生,在第一次對Django的model進行migrate之后,就可以發(fā)現(xiàn)在數(shù)據(jù)庫中出現(xiàn)了一張默認生成的名為django_content_type的表。

如果沒有建立任何的model,默認django_content_type是這樣的:

怎么在Django中使用contenttypes 框架

因此,django_content_type記錄了當前的Django項目中所有model所屬的app(即app_label屬性)以及model的名字(即model屬性)。

當然,django_content_type并不只是記錄屬性這么簡單,contenttypes是對model的一次封裝,

因此可以通過contenttypes動態(tài)的訪問model類型,而不需要每次import具體的model類型。

  • ContentType實例提供的接口

    • 通過model或者model的實例來尋找ContentType類型

    • 通過id尋找ContentType類型,這個跟傳統(tǒng)的get方法的區(qū)別就是它跟get_for_model共享一個緩存,因此更為推薦。

    • 使用當前ContentType類型所代表的模型類做一次get查詢

    • 獲取當前ContentType類型所代表的模型類

    • ContentType.model_class()

    • ContentType.get_object_for_this_type()

    • ContentType管理器(manager)提供的接口

    • ContentType.objects.get_for_id()

    • ContentType.objects.get_for_model()

三、Django ContentTypes的使用場景

在我們這個項目中各種商品的優(yōu)惠卷就運用到了這個知識點:

假使我們models下有這幾張表:

class Electrics(models.Model): #電器類
  name = models.CharField(max_length=32)
  price= models.IntegerField(default=100)

  def __str__(self):
    return self.name


class Foods(models.Model):   #食物類
  name = models.CharField(max_length=32)
  price = models.IntegerField(default=100)

  def __str__(self):
    return self.name


class Clothes(models.Model):  #衣服類
  name = models.CharField(max_length=32)
  price= models.IntegerField(default=100)
  def __str__(self):
    return self.name

class Coupon(models.Model):  #優(yōu)惠券
  name = models.CharField(max_length=32)

  def __str__(self):
    return self.name

我們先來考慮一個問題,如何把這些商品和優(yōu)惠卷相關(guān)聯(lián)?

一種商品一個優(yōu)惠卷,那我們就在表中加入一種商品的優(yōu)惠券,就是一個一對多的ForeignKey,那么多個商品就有各種優(yōu)惠卷,

但是一種商品的特定優(yōu)惠卷在表結(jié)構(gòu)中,就那個字段有值,別的不相關(guān)的記錄為null,而且每增加一個商品,又要手動的去添加外鍵,

這是繁瑣的!

所以我們就使用contenttypes 應(yīng)用中提供的特殊字段GenericForeignKey,我們可以解決上面的問題:

只需要以下三步:

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

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

  • 在model中定義GenericForeignKey字段,傳入上述兩個字段的名字。

具體實例代碼:

class Coupon(models.Model):
  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

這樣的話不管表的數(shù)據(jù)都可以查詢出來,而且添加新的商品的商品,也不需要動優(yōu)惠券的源碼。

但我們在查詢的過程中,用ORM實在太繁瑣了,所以還有一個反向查詢的方法:

就是在每個商品中關(guān)聯(lián) 綁定一個關(guān)系:

coupons = GenericRelation(to='Coupon') # 用于反向查詢,不會生成表字段

上述內(nèi)容就是怎么在Django中使用contenttypes 框架,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:怎么在Django中使用contenttypes框架-創(chuàng)新互聯(lián)
文章出自:http://aaarwkj.com/article24/jccje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、電子商務(wù)小程序開發(fā)、網(wǎng)站排名、靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
亚洲国产成人不卡高清麻豆| 人妻中文字幕精品系列| 国产激情在线四五区观看| 国产三级精品大乳人妇| 欧美三级视频一区二区三区| 久久久人妻精品少妇av| 日本一欧美一欧美一亚洲| 亚洲黄色成人免费观看| 国产91九色视频在线| 日本黄色录像黄色录像| 美国真人性做爰视频免费| 精品人妻中文字幕一区有码| 麻豆人妻少妇精品毛片| 欧美日韩台湾一区二区| 九九视频在线精品免费观看| 国产精品一级片免费看| av第一福利大全导航| 国产蜜臀视频在线播放| 国产男女猛进猛出精品91| 成人影院视频在线播放| 日本三卡=卡无人区| av一级免费在线观看| 亚洲一区二区视频免费看| 日本在线免费成人高清| 人成在线免费视频网站| 午夜少妇福利在线观看| 日本免费一区二区三区的电影啊| 放荡精品少妇一区二区三区| 国产精品男人在线播放| 亚洲福利一区二区在线| 亚洲中文字幕乱码一二三| 亚洲ve中文字幕久久一区二区| 免费高清日本一区二区三区视频| 日本电影在线看一区二区| 久久亚洲一本综合久久| 亚洲国产精品性色av| 精品国产成人一区二区| 免费人成视频在线观看不卡| 蜜桃传媒18传媒在线| 欧美欧美欧美欧美在线| 日本啪啪啪一区二区三区|