當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Django CurrentSiteManager用法及代碼示例


本文介紹 django.contrib.sites.managers.CurrentSiteManager 的用法。

聲明

class managers.CurrentSiteManager

如果 Site 在您的應用程序中發揮關鍵作用,請考慮在您的模型中使用有用的 CurrentSiteManager 。它是一個模型管理器,可以自動過濾其查詢以僅包含與當前 Site 關聯的對象。

強製 SITE_ID

CurrentSiteManager 僅在您的設置中定義了 SITE_ID 設置時可用。

通過將 CurrentSiteManager 明確添加到模型中來使用它。例如:

from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
from django.db import models

class Photo(models.Model):
    photo = models.FileField(upload_to='photos')
    photographer_name = models.CharField(max_length=100)
    pub_date = models.DateField()
    site = models.ForeignKey(Site, on_delete=models.CASCADE)
    objects = models.Manager()
    on_site = CurrentSiteManager()

使用此模型,Photo.objects.all() 將返回數據庫中的所有Photo 對象,但根據 SITE_ID 設置,Photo.on_site.all() 將僅返回與當前站點關聯的Photo 對象。

換句話說,這兩個語句是等價的:

Photo.objects.filter(site=settings.SITE_ID)
Photo.on_site.all()

CurrentSiteManager 怎麽知道 Photo 的哪個字段是 Site ?默認情況下, CurrentSiteManager 查找名為 site ForeignKey 或名為 sites ManyToManyField 進行過濾。如果您使用除 sitesites 以外的名稱的字段來識別您的對象與哪些 Site 對象相關,那麽您需要將自定義字段名稱作為參數顯式傳遞給模型上的 CurrentSiteManager 。以下模型有一個名為 publish_on 的字段,演示了這一點:

from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
from django.db import models

class Photo(models.Model):
    photo = models.FileField(upload_to='photos')
    photographer_name = models.CharField(max_length=100)
    pub_date = models.DateField()
    publish_on = models.ForeignKey(Site, on_delete=models.CASCADE)
    objects = models.Manager()
    on_site = CurrentSiteManager('publish_on')

如果您嘗試使用 CurrentSiteManager 並傳遞一個不存在的字段名稱,Django 將引發 ValueError

最後,請注意,即使您使用 CurrentSiteManager ,您也可能希望在模型上保留一個正常的(非特定於站點的)Manager。如管理器文檔中所述,如果您手動定義管理器,那麽 Django 不會為您創建自動的objects = models.Manager() 管理器。另請注意,Django 的某些部分 - 即 Django 管理站點和通用視圖 - 使用模型中定義的 first 的任何管理器,因此如果您希望管理站點可以訪問所有對象(不僅僅是 site-specific ),在定義 CurrentSiteManager 之前,將 objects = models.Manager() 放入模型中。

相關用法


注:本文由純淨天空篩選整理自djangoproject.com大神的英文原創作品 django.contrib.sites.managers.CurrentSiteManager。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。