我运行一个站点,除了与给定站点相关联的对象的名称和显示之外,它在许多 URL 上运行相同。因此,我扩展了 Site 模型以包含有关站点的各种其他信息,并创建了一个中间件来将标准 Site 对象信息放入请求对象中。以前,我在请求对象中需要的唯一信息是站点名称,我可以从 Django 提供的站点模型中获得。我现在需要一些位于我的扩展站点模型中的信息(以前仅由我的其他各种应用程序模型使用)。
这从向每个页面 ( request.site = Site.objects.get_current()
) 添加一个查询到添加两个,因为我需要获取当前站点,然后从我的模型中获取关联的扩展站点对象。
有没有办法在不使用两个查询的情况下获取这些信息?或者甚至不使用一个?
模型.py:
from django.contrib.sites.models import Site
class SiteMethods(Site):
"""
Extended site model
"""
colloquial_name = models.CharField(max_length=32,)
...
中间件.py:
class RequestContextMiddleware(object):
"""
Puts the Site into each request object
"""
def process_request(self, request):
# This runs two queries on every page, instead of just one
request.site = SiteMethods.objects.get(id=Site.objects.get_current().id)
return None
在我的settings.py
文件中,我拥有所有共享的配置数据。我的服务器实例(gunicorn)配置为 load [site]_settings.py
,它包含所有特定于站点的设置(包括 Django 的SITE_ID
),并在底部:
try:
from settings import *
except ImportError:
pass
我正在寻找不包括引用硬编码的选项(如果存在SITE_ID
)[site]_settings.py
。
更新:
正如下面所建议的,子类对象应该仍然可以访问它们的父对象和所有父对象的功能。对于 Site 对象,奇怪的是,情况似乎并非如此。
>>> Site.objects.get_current()
<Site: website.com>
>>> SiteMethods.objects.get_current()
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'Manager' object has no attribute 'get_current'
>>> SiteMethods.objects.select_related('site').get_current() # as suggested below
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'get_current'
>>> dir(SiteMethods)
['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__', '__dict__',
'__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__',
'__metaclass__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__',
'__weakref__', '_base_manager', '_default_manager', '_deferred', '_get_FIELD_display',
'_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val',
'_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks',
'_set_pk_val', 'clean', 'clean_fields', 'date_error_message', 'delete', 'full_clean',
'objects', 'pk', 'prepare_database_save', 'save', 'save_base', 'serializable_value',
'site_ptr', 'sitemethods', 'unique_error_message', 'validate_unique',]