Группировка наборов запросов по категориям django
У меня есть модель Ingredient
и модель Shopping
для списка покупок, и я хотел бы группировать ингредиенты по их категориям в представлении списка покупок. Существует ли SQL-метод для этого или выполнение цикла for для каждой категории в модели Shopping
является самым простым способом достижения этой цели?
Ниже приведен пример того, чего я хотел бы добиться в представлении списка покупок:
#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.