0

製品に多くの画像を含めることができるテーブルProductsとがあるとします。Images検索結果ページの製品リストを取得するとき、最初の製品画像をサムネイルとして含めるにはどうすればよいですか?

パフォーマンスも考慮した場合、どうするのが最善の方法でしょうか? (クエリ数、メモリ、全体時間など)

4

2 に答える 2

0

アーキテクチャを大幅に変更せずにパフォーマンスを向上させる必要がある場合は、非正規化を試す最初の方法です。

class Product(models.Model): # instead of Products as convention
    first_image = models.ImageField(editable=False, null=True)

次に、信号を介して更新されたfirst_imageときを維持します。Product.image_set

また、ダンプされたフィールド内に「weakref」を保存することもできます(本当に必要なときにこれを使用してください:)

class Product(models.Model):
    # from django-jsonfield, store raw values of ImageField of the Images model
    extra = JSONField()
    def first_image(self):
        image = self.extra.get('image')
        return models.ImageField.attr_class(None, models.ImageField(), image) if image else None

他の簡単な方法には次のものがあります。

  • 最初の画像をバッチで読み込み、テンプレート ループ per で使用しますProduct()。最初の画像は、簡単にクエリできるようにマークする必要があります。
  • ではなく直接格納first_imageします。これは、管理要件があまりない単純なサイトでは問題なく機能します。ProductImages
于 2012-10-28T16:45:32.627 に答える
0

テンプレートで直接画像を取得したいと思うでしょう。アイテムの数に応じて、ビューでリストを作成してテンプレートに渡すのではなく。

したがって、Products最初の画像を見つけてその URL を返すモデルにメソッドを実装することをお勧めします。

models.py

def Products(models.Model):
    #your fields

    def get_image_url(self):
        try:
            img = self.images_set.filter()[0] #get first image
            return img.url()
        except Exception:
            return None

テンプレート内:

{% for p in product_list %}
     {# render product and add image #}
     <img href="{{p.get_image_url }}" />
{% endfor %}
于 2012-10-28T15:35:41.197 に答える