假设我有表格Products
和Images
,其中一个产品可以有许多图像。在为搜索结果页面获取产品列表时,如何将第一个产品图像包含为缩略图?
当还考虑性能时,最好的方法是什么?(查询次数、内存、总时间等)
假设我有表格Products
和Images
,其中一个产品可以有许多图像。在为搜索结果页面获取产品列表时,如何将第一个产品图像包含为缩略图?
当还考虑性能时,最好的方法是什么?(查询次数、内存、总时间等)
我相信您会想直接在模板中获取图像。而不是在视图中构建一个列表并将其传递到模板中,因为会有很多项目。
所以我会建议在Products
模型中实现一个方法来找到第一个图像并返回它的 url。
模型.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 %}
如果您需要在不进行大量架构改造的情况下提高性能,则反规范化是第一种尝试方法:
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
. 这适用于没有太多管理要求的简单站点。