Группировка наборов запросов по категориям django

У меня есть модель Ingredient и модель Shopping для списка покупок, и я хотел бы группировать ингредиенты по их категориям в представлении списка покупок. Существует ли SQL-метод для этого или выполнение цикла for для каждой категории в модели Shopping является самым простым способом достижения этой цели?

Ниже приведен пример того, чего я хотел бы добиться в представлении списка покупок:

end result

#models.py

class Ingredient(models.Model):
    name = models.CharField(max_length=220)
    category = models.CharField(max_length=50, default="uncategorised")

class Shopping(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=220, blank=True, null=True) # users can create their own items not just those in the Ingredient model
    category = models.CharField(max_length=80, default="uncategorised")





#views.py
# How I am currently getting this data
queryset = Shopping.objects.filter(user=request.user).order_by('category')
shoppingList = {}
for item in queryset:
    
    if item[1] in shoppingList:
        shoppingList[item[1]].append(item[0])
    else:
        shoppingList[item[1]] = []
        shoppingList[item[1]].append(item[0])

В случае использования PostgreSQL, вы можете использовать ArrayAgg в annotate с values:

from django.contrib.postgres.aggregates import ArrayAgg

queryset = Shopping.objects.filter(
    user=request.user
).values("ingredients__category").annotate(
    ingredient_list=ArrayAgg('ingredients__name')
).all()

Тогда вы получите список с желаемой структурой и вам не нужно будет выполнять никаких вычислений на стороне Python.

Вернуться на верх