database - 有没有一种数据库密集度较低的方法可以从我的扩展 Django 站点模型中获取数据?

标签 database django django-models django-middleware django-sites

我经营的网站在许多 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) 配置为加载 [site]_settings.py,它包含所有特定于站点的设置(包括 Django 的 SITE_ID),并在底部:

try:
    from settings import *
except ImportError:
    pass

我正在寻找不包括在 [site]_settings.py 中引用硬编码 SITE_ID 的选项(如果存在)。

更新:

正如下面所建议的,子类化的对象应该仍然可以访问它们的父对象和所有父对象的功能。对于 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',]

最佳答案

由于您对 Site 进行了子类化,您应该能够执行 SiteMethods.objects.get_current(),这将为您提供一个实例站点方法。由于 Django 的 MTI(多表继承)实现对父类使用 OneToOneField,因此您也应该能够对 site 使用 select_related。因此,请尝试以下操作:

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

关于database - 有没有一种数据库密集度较低的方法可以从我的扩展 Django 站点模型中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691822/

相关文章:

sql查询,可以存在LIKE和==运算符吗?

c# - Entity Framework 最佳实践 : What layer should call SaveChanges()?

sql - 如何重新排序 oracle 表 ID

django - 在 Django 模型中设置主键起始值

python - Django ORM 查询性能

php - 在我的 mysql 查询中无法正常工作的地方

django - 如何在您的网站中添加分页器和过滤器?

django - 使用Django表单显示和编辑?

具有现有数据库的 Django 模型

django - 如何在django中没有模型的情况下从数据库中获取数据?