Han*_*pan 2 python django django-models
我的模型中有一个属性:
def _get_image(self):
return Media.objects.get_for_object(self)
image = property(_get_image)
Run Code Online (Sandbox Code Playgroud)
它在我的Media模型上调用以下函数:
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)
Run Code Online (Sandbox Code Playgroud)
然后在我的模板中,我正在迭代结果,如下所示:
{% if entry.image %}
<h2>Current image:</h2>
{% for m in entry.image %}
{{ m }}
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我的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 )
Run Code Online (Sandbox Code Playgroud)
因此,每当我访问entry.image时,数据库都会受到攻击.当然它应该存储结果或什么?
"或者其他的东西"?
为什么要存储结果?您已明确编写该_get_image函数,以便每次都查询数据库.如果您希望它存储结果,您需要告诉它执行此操作.
可能最简单的方法是在模板中获取一次:
{% with entry.image as images %}
{% if images %}
<h2>Current image:</h2>
{% for m in images %}
{{ m }}
{% endfor %}
{% endif %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |