Django список запросов к шаблону - отображение элементов по категориям - PullRequest
0 голосов
/ 27 мая 2020

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

Я не знаю, как это сделать с помощью одного запроса в 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 %}

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Итак, я обнаружил, что не так в моей функции

 # 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)
0 голосов
/ 27 мая 2020

честно говоря, мне не нравится, как вы строите словарь. Если вы не против построить его вот так ...

, тогда это будет работать

def getSubs(self, item):
    return {
        "options", MenuOptionItem.objects.get(menu=item.id),
        "extra", MenuExtraItem.Objects.get(menu=item.id)
    }
def getItem(self, category):
    return {item: getSubs(item) for item in Menu.objects.filter(owner=self.id, category=category)}

def get_menu_list(self):
    categories =Menu.objects.filter(owner=self.id).order_by("category").values("category").distinct()
    return {category: getItems(category) for category in categories}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...