Как ограничить поля, возвращаемые в наборе запросов Django для каждого поля - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть ряды товаров, которые, как правило, делятся некоторой информацией, такой как одни и те же изображения (изображение может показывать несколько товаров), описания, производитель и т. Д.

Я хотел бы выбрать некоторые поля дляпоказывать информацию только один разЯ не могу использовать различные для этого (я не думаю), так как информация не всегда идентична, как, например, с описанием, но может быть лишь немного отличается настолько, что я не хочу повторять это.

В данный момент я использую цикл for для отображения полей каждого результата, который заканчивается примерно так: this:

Это кодЯ использую в своем представлении:

def collection_detail(request, name=None):
    template = loader.get_template('/webapps/mywebapp/furniture/main_page/templates/main_page/detail.html')
    products = product.objects.filter(id=name)
    cart_product_form = CartAddProductForm()
    context={'products': products,
    'cart_product_form': cart_product_form}
    return HttpResponse(template.render(context))

Каков будет подходящий способ сделать это в представлении, игнорируя последующие строки для некоторых полей?

edit: Пример результатов набора запросов

collection_name|manufacturer|product_type|description|image_url
----------------------------------------------------------------
Testing        |FakeCo      |Bed         |pretty nice|/img/1.jpg
Testing        |FakeCo      |Desk        |pretty bad |/img/2.jpg
Testing        |FakeCo      |Nightstand  |pretty ok  |/img/1.jpg
Testing        |FakeCo      |Draws       |pretty nice|/img/3.jpg

В примере приведенных выше данных я хочу показать название коллекции и производителя только один раз, чтобы получился первый результат, каждый тип продукта, первое описание независимо от того, что он говорит, и каждое изображение, котороеотличается и не является дубликатом.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018
products = product.objects.filter(id=name)
collection_name = []
manufacturer = []
product_type = []
description = []
image_url = []
for product in products:
    collection_name.append(product.collection_name)
    manufacturer.append(product.manufacturer)
    product_type.append(product.product_type)
    description.append(product.description)
    image_url.append(product.image_url)
collection_name = set(collection_name)
manufacturer = set(manufacturer)
product_type = set(product_type)
description = set(description)
image_url = set(image_url)

Это немного долго, но это решит вашу проблему.«set» сделает все общие имена один раз в списке.

0 голосов
/ 31 декабря 2018

К этому

products = product.objects.filter(id=name)

он вернет набор запросов, что означает, что он состоит из информации о нескольких продуктах.Если вы хотите получить информацию только об отдельных объектах, измените запрос, как показано ниже:

products = product.objects.filter(id=name).first()
or,
products = product.objects.filter(id=name)[:1]

Обновление Если вы хотите отобразить несколько полей одним значением, используйте это:

{{ value|first }}
...