我的数据格式如下:
collection_name | type | manufacturer | description | image_url
---------------------------------------------------------------------------
beach | bed | company a | nice bed | 1.jpg
beach | king bed | company a | nice bed | 1.jpg
beach | nightstand | company a | nice ns | 1.jpg
grass | chest | company a | nice chest | 2.jpg
apple | chest | company a | nice chest | 3.jpg
fiver | chest | company b | good chest | 4.jpg
我需要做的是选择所有图像,并且只返回每个图像一次(不同),然后为每个图像返回不明显的行。
我的目标是确保在模板中只显示一次每个图像,但显示与每个图像相关的所有记录。
在上面的示例中,1.jpg是一张图像,它将在一张图像中同时显示床和床头柜。我想显示这样的图像并列出相关产品。
虽然在SQL / db级别询问而不是在寻求纯django解决方案,但我也遇到过类似的问题。
我一直在视图中使用的查询类似于:
products = product.objects.filter(collection_name=name)
然后遍历产品,像这样检索image_url:
{% for instance in products %}
{{ instance.image_url }}
{{ endfor }}
我已经尝试过各种尝试来限制模板中的重复图像,但是没有一个真正起作用,并且在我看来,尝试这样做没有成功。
解决这个问题的正确方法是什么?
编辑: 我模型的相关摘录与上面的示例数据匹配:
class Product(models.Model):
collection_name = models.TextField(null='true',blank='true')
type = models.TextField(null='true',blank='true')
manufacturer = models.TextField(null='true',blank='true')
description = models.TextField(null='true',blank='true')
image_url = models.TextField(null='true',blank='true')
编辑: 在阅读docs并查看了其他问题(无答案)后,我的观点和试图解决此问题的逻辑的想法:< / p>
将集合中任何产品的product_id传递给视图。然后根据id字段获取记录的collection_name字段:
collectionname = product.objects.filter(id=id).values('collection_name').distinct()
然后,当我们有collection_name字段时,返回给定collection_name的所有产品:
products = product.objects.filter(collection_name__in=collectionname)
然后,最后,返回给定集合名称的image_url结果列表,并删除重复项:
images = product.objects.filter(collection_name__in=collectionname).values('image_url').distinct()
从理论上讲,我认为这应该可行...
编辑:
当前正在根据Juancarlos的以下回答进行以下尝试:
products = product.objects.filter(collection_name=name)
collectionname = product.objects.filter(id=id).values('collection_name').distinct()
images = product.objects.filter(collection_name__in=collectionname).values("image_url").distinct()
results = []
for img in images:
pbis = product.objects.filter(collection_name__in=collectionname, image_url=img['image_url'])
obj = {"image": img['image_url'], "items":[{"type":pbi.type} for pbi in pbis]}
results.append(obj)
答案 0 :(得分:1)
您需要告知django您想区分哪个字段,您可以使用values
来做到这一点:
在您的情况下,您的答案可以如下所示:
products = product.objects.filter(collection_name=name).values("image_url").distinct()
答案 1 :(得分:1)
这种逻辑可以帮助您,我不确定,但是您可以执行以下操作:
images = product.objects.filter(collection_name=name).values("image_url").distinct()
results = []
for img in images:
pbis = product.objects.filter(collection_name=name, image_url=img['image_url'])###this get all record tha contains this image
obj = {"image": img['image_url'], "items":[{"attr":pbi.attr, ...} for pbi in pbis]}
results.append(obj)
###this iterate all record by images and you can store items attribute from all recors that contains that image