Существует ли менее интенсивный способ получения данных из моей расширенной модели сайта Django?

Я запускаю сайт, который работает одинаково по многим URL-адресам, за исключением имени и отображения объектов, связанных с данным сайтом. Из-за этого я расширил модель сайта, включив в нее различную информацию о сайте, и создал промежуточное программное обеспечение для помещения стандартной информации об объекте сайта в объект запроса. Ранее единственной информацией, которая мне была нужна в объекте запроса, было имя сайта, которое я мог получить из моделей сайта, которые предоставляет Django. Теперь мне нужны фрагменты информации, которые находятся в моей расширенной модели сайта (которая ранее использовалась только в других моих различных моделях приложений).

Это идет от добавления одного запроса на каждую страницу (request.site = Site.objects.get_current()) добавить два, так как мне нужно получить текущий сайт, а затем получить связанный расширенный объект Site из моей модели.

Есть ли способ получить эту информацию, не используя два запроса? Или даже не используя один?

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, который содержит все специфичные для сайта настройки (включая Django's 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',]

1 ответ

Решение

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

SiteMethods.objects.select_related('site').get_current()
Другие вопросы по тегам