gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:17:53 25 4
gpt4 key购买 nike

我经营的网站在许多 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com