Django - вернуть все связанные строки для отдельного набора результатов с помощью postgres backend - PullRequest
0 голосов
/ 08 марта 2019

У меня есть данные в следующей форме:

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')

Редактировать: Моя идея опредставления и логика, чтобы попытаться решить эту проблему, прочитав документы и посмотрев на другие вопросы (без ответов):

Передайте product_id любого продукта в коллекции в представление.Затем получите поле collection_name записи на основе поля id:

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()

Я думаю, что это должно работать, в теории ...

Редактировать:

В настоящее время предпринимаются следующие попытки, основанные на ответе Хуанкарлоса ниже:

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 ]

1 голос
/ 08 марта 2019

Возможно, эта логика может помочь вам, я не уверен, но вы можете сделать что-то вроде этого:

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

1 голос
/ 08 марта 2019

Вам нужно указать django, какое поле вы хотите различить, вы можете использовать values, чтобы сделать это: в вашем случае ваш ответ можно увидеть так:

products = product.objects.filter(collection_name=name).values("image_url").distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...