当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。