У меня есть данные в следующей форме:
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)