Django-使用postgres后端返回所有相关的行以获取不同的结果集

时间:2019-03-08 16:51:20

标签: django postgresql django-templates django-views

我的数据格式如下:

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)

2 个答案:

答案 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