python - Django - 为什么这两次访问数据库

标签 python django django-models

我的模型中有一个属性:

def _get_image(self):
    return Media.objects.get_for_object(self)

image = property(_get_image)

它在我的媒体模型上调用了以下函数:

def get_for_object(self, obj):
        ctype = ContentType.objects.get_for_model(obj)
        return self.filter(items__content_type__pk=ctype.pk, items__object_id=obj.pk)

然后在我的模板中,我将像这样遍历结果:

{% if entry.image %}
<h2>Current image:</h2>
{% for m in entry.image %}
    {{ m }}
{% endfor %}
{% endif %}

出于某种原因,我的 SQL 读数显示这两个查询紧挨着彼此:

0.40    SELECT
EXPLAIN
Toggle Stacktrace
SELECT `media_media`.`id`, `media_media`.`file`, `media_media`.`content_type`, `media_media`.`created` FROM `media_media` INNER JOIN `media_mediaattachment` ON (`media_media`.`id` = `media_mediaattachment`.`media_id`) WHERE (`media_mediaattachment`.`content_type_id` = 12 AND `media_mediaattachment`.`object_id` = 20 )
0.38    SELECT
EXPLAIN
Toggle Stacktrace
SELECT `media_media`.`id`, `media_media`.`file`, `media_media`.`content_type`, `media_media`.`created` FROM `media_media` INNER JOIN `media_mediaattachment` ON (`media_media`.`id` = `media_mediaattachment`.`media_id`) WHERE (`media_mediaattachment`.`content_type_id` = 12 AND `media_mediaattachment`.`object_id` = 20 )

因此,每当我访问 entry.image 时,数据库就会受到攻击。当然它应该存储结果或其他什么?

最佳答案

“或者什么”?

为什么要存储结果?您明确编写了 _get_image 函数,以便它每次都查询数据库。如果你想让它存储结果,你需要告诉它去做。

可能最简单的方法是只在模板中获取一次:

{% with entry.image as images %}
  {% if images %}
  <h2>Current image:</h2>
    {% for m in images %}
      {{ m }}
    {% endfor %}
  {% endif %}
{% endwith %}

关于python - Django - 为什么这两次访问数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4932476/

相关文章:

python - django 1.5 + pymysql 错误 : ImportError: cannot import name Thing2Literal

django - 限制ModelAdmin中外键的选项返回 "Select a valid choice"

具有自定义匹配功能的Python序列匹配器

python - 将带有列表的 Pandas 列转换为字符串

python - 执行 python manage.py runserver 时 cmp 错误超出最大递归深度

python - 进行子选择的 django 方法是什么?

python - Django 中的模型历史

python:卡片目录的容器 - sqlite,dict,其他?

python - 如何包含包含另一个模板的模板?

django - ImportError : No module named django. core.handlers.wsgi 在 apache 上安装 django mod_wsgi 配置