TransWikia.com

Django, QuerySet

Stack Overflow на русском Asked on February 3, 2021

Всем привет. Есть три модели:

  1. Catalog в котором есть "Каталог автошин", "Каталог автодисков" и т.д.
  2. Manufactures (производители) внутри которого "bosch", "michelin" "motador" и т.д.
  3. Product у которого ForeignKey и на Catalog и на
    Manufactures.

Задача:
Через продукты отфильтровать производителей по каталогам.
То есть если "bosch" и "michelin" относятся к дискам то передать их в "Каталог автодисков".

from django.db import models
    
    
class Catalogs(models.Model):
    class Meta():
        verbose_name = 'Каталог'
        verbose_name_plural = 'Каталоги'
    
    catalog_name = models.CharField(max_length=40, verbose_name='Название каталога', blank=False)
    catalog_image = models.ImageField(upload_to='catalog_images', verbose_name='Картинка каталога')
    # ...
    
class Manufactures(models.Model):
    class Meta():
        verbose_name = 'Производитель'
        verbose_name_plural = 'Производители'
    
    manufacture_name = models.CharField(max_length=30, verbose_name='Название производителя', blank=False)
    # ...
    
class Product(models.Model):
    class Meta():
        verbose_name = 'Шина'
        verbose_name_plural = 'Шины'
    
    tire_image = models.ImageField(blank=False, upload_to='tire_images', verbose_name='Картинка продукта')
    tire_name = models.CharField(max_length=60, verbose_name= 'Название продукта', blank=False)
    tire_manufacturer = models.CharField(max_length=30, verbose_name='Производитель:', blank=False)
    tire_size = models.FloatField(verbose_name='Размер', blank=False)
    tire_load = models.CharField(verbose_name='Нагрузка', blank=False, max_length=12)
    tire_price = models.FloatField(verbose_name='Цена', blank=False)
    connect_manufacture = models.ForeignKey(Manufactures, verbose_name='Выберите производителя')
    connect_catalog = models.ForeignKey(Catalogs, verbose_name='Выберите каталог')

Помогите решить задачу.

2 Answers

# Достаём список уникальных имён всех каталогов
catalog_names = Product.objects.values_list('connect_catalog__catalog_name', flat=True).distinct()

manufactures_by_catalog = {}

# Для каждого имени каталога ищем производителей через `Product`.
for catalog_name in catalog_names:
    # Достаём список уникальных производителей из всех продуктов с категорией 'category_name'
    manufactures = Product.objects.filter(connect_catalog__catalog_name=catalog_name).values_list('connect_manufacture__manufacture_name', flat=True).distinct()
    manufactures_by_catalog[catalog_name] = list(manufactures)

В итоге мы получим dict где ключи это имена каталогов а значения это список имён производителей.

Answered by NEWME0 on February 3, 2021

Для начала можешь создать форму для отбора в forms.py, потом во view.py делаешь функцию которая будет ловить запрос по этой форме и отдавать нужные категории. Если хоть немножко рубишь в JS то можно сделать без форм и отдавать то что тебе надо через самодельное API, тут уже как угодно делай, либо отдавай сразу отрендеренный HTML, либо JSON готовь и уже JS-ом его отображай.

Answered by Sergei Malanin on February 3, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP