группируйте элементы с одинаковым значением с этим значением в качестве заголовка

#python #django #list

#python #django #Список

Вопрос:

Я практикуюсь в python и django, создавая сайт рецептов. Я могу добавлять ингредиенты (класс RecipeIngredient) для каждого рецепта, используя встроенные строки, ища ингредиенты, которые у меня уже есть в моей базе данных (класс Ingredient) (с информацией о питании и т. Д.). В результате получается один большой список ингредиентов для каждого рецепта.

Чтобы упорядочить их, я добавил атрибут step и stepnum. Я возвращаю список, упорядоченный по stepnum, но как я могу разделить их? Например. Если вы делаете торт, у вас будут ингредиенты для торта и для глазури. все ингредиенты для глазури получат значение шага «глазурь» и значение шага 0. все ингредиенты для торта получат значение шага «торт» и значение шага 1.

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

Как?

У меня есть этот код на моем recipedetail.html:

 <div><h1> INGREDIENTS:  </h1></div>     
    <div>
    {% for ingredients in recipe.get_text %}

            <ul>

                {% for item in ingredients %}
                
        

                    <li><em>
                        {{item.1|safe}} {% if item.2 is not None %} {{item.2|safe}} {% endif %} {{ item.0|safe}}
                        
                    </em></li>

                {% endfor %}
            </ul>

    {% endfor %}
    </div>
  

и функция get_text:

 def get_text(self):
    a = []
    ingredients = []
    for ingredient in self.RecipeIngredients.all():
        ingredients.append((ingredient.ingredientname, ingredient.amount, ingredient.unit, ingredient.step, ingredient.stepnum))
        ingredients.sort(key=lambda tup: tup[4])
    a.append(ingredients)
    
    return a
  

и моя модель:

 class RecipeIngredient(models.Model):
recipe = models.ForeignKey(Recipe, related_name='RecipeIngredients', on_delete=models.CASCADE)
ingredientname = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
amount = models.IntegerField(blank=True, null=True)
unit = models.ForeignKey(Unit, on_delete=models.CASCADE, blank=True, null=True)
step = models.CharField(max_length=200, blank=True)
stepnum = models.IntegerField(default="0")

def __str__(self):
    return str(self.ingredientname)
  

Ответ №1:

Вы могли бы сделать это в своей модели, добавив:

 class Meta:
    ordering = ['step', 'stepnum']
  

Или в views.py использование group by.

Попробуйте выполнить тяжелую работу, прежде чем перейти к шаблону.