Существует ли менее интенсивный способ получения данных из моей расширенной модели сайта 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()