2011-02-08 10 views
2

データベースに当たっている私は私のモデルでプロパティを持っています。ジャンゴ - なぜこの二回

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の読取りで、これらの2つのクエリが互いに隣り合って表示されます。

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にアクセスするたびに、データベースがヒットしています。確かにそれは結果や何かを保存する必要がありますか?

答えて

3

は、ここでは、明示的__init__方法でNoneにキャッシュを設定せずに、キャッシュプロパティを記述方法は次のとおりです。

def _get_image(self): 
    if not hasattr(self, '_image'): 
     self._image = Media.objects.get_for_object(self) 
    return self._image 

image = property(_get_image) 

またはより現代的な構文

@property 
def image(self): 
    if not hasattr(self, '_image'): 
     self._image = Media.objects.get_for_object(self) 
    return self._image 
6

"または何か"?

なぜ結果を保存する必要がありますか?毎回データベースに照会するように、関数_get_imageを明示的に記述しました。結果を保存する場合は、結果を伝える必要があります。

おそらく最も簡単な方法は、単にテンプレートに一度それを得るために、次のようになります。

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

ありがとう、これはcですそれを行うレバー方法。私の無知を許して、私はまだdjangoがどのようにクエリを扱うかを学んでいます。 – Hanpan