Я запускаю сайт, который работает на многих URL-адресах, за исключением имени и отображения объектов, привязанных к данному сайту. Из-за этого я расширил модель сайта, чтобы включить различные другие биты информации о сайте и создал промежуточное программное обеспечение, чтобы помещать стандартную информацию об объекте сайта в объект запроса. Раньше единственной информацией, которая мне нужна в объекте запроса, было имя сайта, которое я мог получить с помощью моделей сайта Django. Мне теперь нужны биты информации, которые находятся в моей расширенной модели сайта (которая ранее использовалась только для моих других моделей приложений).Существует ли менее интенсивный базы данных для получения данных из моей расширенной модели сайта Django?
Это идет от добавления одного запроса на каждую страницу (request.site = Site.objects.get_current()
) для добавления два, как мне нужно, чтобы получить текущий сайт, а затем получить соответствующий расширенный объект сайта из моей модели.
Есть ли способ получить эту информацию без использования двух запросов? Или даже без использования?
models.py:
from django.contrib.sites.models import Site
class SiteMethods(Site):
"""
Extended site model
"""
colloquial_name = models.CharField(max_length=32,)
...
middleware.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) сконфигурированы для загрузки [site]_settings.py
, который содержит все настройки по конкретным участкам (в том числе Джанго SITE_ID
), а в нижней части:
try:
from settings import *
except ImportError:
pass
Ищу варианты (если они существуют), что делать не включают ссылки на жестко закодированные SITE_ID
в [site]_settings.py
.
Update:
Как предлагается ниже, подклассы объекты должны по-прежнему иметь доступ к своим родительским объектам и все функциональные возможности родительского объекта. Для объекта сайта, как ни странно, это, похоже, не так.
>>> 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',]
По какой-то причине я думал, что Django кэшировал объекты сайта по умолчанию для каждого экземпляра. –