製品に多くの画像を含めることができるテーブルProducts
とがあるとします。Images
検索結果ページの製品リストを取得するとき、最初の製品画像をサムネイルとして含めるにはどうすればよいですか?
パフォーマンスも考慮した場合、どうするのが最善の方法でしょうか? (クエリ数、メモリ、全体時間など)
製品に多くの画像を含めることができるテーブルProducts
とがあるとします。Images
検索結果ページの製品リストを取得するとき、最初の製品画像をサムネイルとして含めるにはどうすればよいですか?
パフォーマンスも考慮した場合、どうするのが最善の方法でしょうか? (クエリ数、メモリ、全体時間など)
アーキテクチャを大幅に変更せずにパフォーマンスを向上させる必要がある場合は、非正規化を試す最初の方法です。
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
他の簡単な方法には次のものがあります。
Product()
。最初の画像は、簡単にクエリできるようにマークする必要があります。first_image
します。これは、管理要件があまりない単純なサイトでは問題なく機能します。Product
Images
テンプレートで直接画像を取得したいと思うでしょう。アイテムの数に応じて、ビューでリストを作成してテンプレートに渡すのではなく。
したがって、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 %}