Я пытаюсь создать массив для перехода на страницу шаблона, которая должна сгруппировать мои элементы по категориям.
Я не знаю, как это сделать с помощью одного запроса в Django, поэтому я решил определить функцию, которая должна получить массив, аналогичный результату, который я хотел бы показать
Моя цель отобразить
Title: Category_A
|
|_Menu_item_1_in_cat_A
|_option_1_of_menu_item_1
|_option_2_of_menu_item_1
|_extra_1_of_menu_item_1
|
|_Menu_item_2_in_cat_A
|_option_1_of_menu_item_2
Title: Category_B
|
|_Menu_item_3_in_cat_B
|_option_1_of_menu_item_3
|_option_2_of_menu_item_3
|_extra_1_of_menu_item_3
Моя функция не работает ... это результат, но есть элементы для отображения ...
[{'category': 'Category A', 'items': {}, 'options': {}, 'extras': {}}, {'category': 'Category B', 'items': {}, 'options': {}, 'extras': {}}]
Models.py
class Owner
...
def get_menu_list(self):
menu_list = []
# defining the categories
categories = (
Menu.objects.filter(owner=self.id)
.order_by("category")
.values("category")
.distinct()
)
for category in categories:
# create main group
details = {}
details["category"] = category["category"]
# select the items present in the category
items_list = []
options_list = []
extras_list = []
for item in Menu.objects.filter(owner=self.id, category=category)
items_list.append(item)
# add options and extra to the category
for item in MenuOptionItem.objects.get(menu=item.id)):
options_list.append(option)
for extra in MenuExtraItem.objects.get(menu=item.id)):
extras_list.append(extra)
details["items"] = items_list
details["options"] = options_list
details["extras"] = extrass_list
menu_list.append(details)
return menu_list
class Menu(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
menu_title = models.CharField(max_length=500, blank=False)
short_description = models.CharField(max_length=500, blank=False)
image = models.ImageField(upload_to="menu_images/", blank=False)
price = models.DecimalField(max_digits=14, decimal_places=2, default=0)
category = models.CharField(max_length=500, blank=True)
class MenuOptionItem(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=14, decimal_places=2, blank=True)
desc = models.CharField(max_length=100, blank=True)
class MenuExtraItem(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
price = models.DecimalField(max_digits=14, decimal_places=2, blank=True)
desc = models.CharField(max_length=100, blank=True)
Views.py
restaurant = Owner.objects.get(id=owner_id)
return render(
request,
"detail_page.html",
{
"restaurant": owner,
},
)
detail_page. html
{% for category, items in restaurant.get_menu_list %}
...
{% for item in items %}
{{ item.name }}
{% for option in item.options %}
{{ option.name }}
{% endfor %}
{% for extra in item.extras %}
{{ extra.name }}
{% endfor %}
...
{% endfor %}
...
{% endfor %}
Спасибо за любую помощь!