首页 > 解决方案 > Django查询列表到模板 - 按类别显示项目

问题描述

我正在尝试创建一个数组以传递给模板页面,该页面应根据其类别对我的项目进行分组。

我不知道如何在 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': {}}] 

模型.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)


视图.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 %}

感谢您的任何帮助!

标签: pythonsqldjango

解决方案


所以我发现我的功能出了什么问题

 # select the items present in the category
        details["items"] = Menu.objects.filter(
            restaurant=self.id, category=category["category"]
        )

        for item in Menu.objects.filter(
            restaurant=self.id, category=category["category"]
        ):
        details["options"] = MenuOptionItem.objects.filter(menu=item.id)
        details["ingredients"] = MealExtraItem.objects.filter(menu=item.id)

推荐阅读