@NogerbekNurzhan

Как составить правильный список записей связанных моделей данных?

Здравствуйте, помогите пожалуйста разобраться!

Есть две модели данных: Section (Секция), Product (Продукт).

models.py:
class Section(models.Model):
	name = models.CharField(max_length=255, blank=False, null=True,)

class Product(models.Model):
	name = models.CharField(max_length=255, blank=False, null=True,)
	section = models.ForeignKey(Section,on_delete=models.CASCADE)


Хочу вывести в template все секции и относящие к этой секции продукты. Использовал для этого встроенный в Django тег regroup (см. ниже), но стокнулся с проблемой. Во первых не выводятся секции у которых нет продуктов. Во вторых есть продукты у которых в поле section в БД стоит NULL их тоже нужно сгруппировать. Что можете посоветовать? Был бы очень благодарен примером.

views.py:
context['products'] = Product.objects.select_related('section').order_by('section')


template:
{% regroup products by section as products_by_section %}

{% for section in products_by_section %}
    {{ section.grouper}}
    {% for product in section.list %}
        {{ product }}
    {% endfor %}
{% endfor %}
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
@NogerbekNurzhan Автор вопроса
Решил задачу следующим образом.

views.py:
# Получаем все секции
sections = Section.objects.all().prefetch_related('product_set')

# Cоздаем словарь с секциями и принадлежащим им продуктам
section_products_dict = {}
for section in sections:
    section_products_dict[section.id] = section.product_set.all()

# Передаем наш словать в шаблоне
context['dictionary'] = section_products_dict


template:
{% for section, products in dictionary.items %}
    {{section}}
    {% for product in products %}
        {{product}}
    {% endfor %}
{% endfor %}


Для продуктов у которых нет привязки к секции нужно создать отдельный queryset во view.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
idegree
@idegree
Senior Workaround Developer
Можно попробовать зайти с другой стороны:
views.py
def home(request):
    sections = Section.objects.all()
    return render(request, 'app/page.html', {'sections': sections})

page.html
{% for section in sections %}
    {{ section.name }}
    <ul>{% for product in section.product_set.all %}
        <li>{{ product.name }}</li>
    {% endfor %}</ul>
{% endfor %}

Единственное, при таком подходе опять таки не отобразятся продукты без категории, на что я рекомендовал бы вешать категорию по умолчанию на продукт. Также, нужно учесть, что при обращении к товарам каждой категории будет происходить запрос в БД, что можно решить с помощью prefetch_related(). Но это неточно, лучше проверить количество запрсов к БД с помощью django-debug-toolbar.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы