1

Я запускаю сайт, который работает на многих 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',] 
+0

По какой-то причине я думал, что Django кэшировал объекты сайта по умолчанию для каждого экземпляра. –

ответ

2

Поскольку вы подклассы Site вы должны быть в состоянии просто SiteMethods.objects.get_current(), который будет чистый вам экземпляр SiteMethods. Поскольку реализация Django MTI (множественное наследование таблиц) использует OneToOneField для родительского класса, вы также можете использовать select_related для site. Итак, попробуйте следующее:

SiteMethods.objects.select_related('site').get_current() 
+0

Обновлено мое оригинальное сообщение с сообщениями об ошибках из этих предложений. – Bryson

+0

Попробуйте явно добавить 'django.contrib.sites.models.SiteManager' как' objects' в вашу модель 'SiteMethods'. –

 Смежные вопросы

  • Нет связанных вопросов^_^