Как использовать пункт Group by без id модели в Django ORM?
Это моя модель
class Model1(models.Model):
category = models.CharField()
name = models.CharField()
Я хочу получить счетчик category
. Поэтому я написал ORM следующим образом:
from django.db.models import Count
result = Model1.objects.values('category').annotate(Count('sns_type'))
но результат показан как показано ниже
<QuerySet [{'category': 'A', 'category__count': 1},
{'category': 'B', 'category__count': 1},...]>
Я чувствовал себя так странно, поэтому я напечатал запрос этого результата. Запрос выглядит следующим образом
SELECT "example_table"."category", COUNT("example_table"."category") AS "category__count"
FROM "example_table"
GROUP BY "example_table"."category", "example_table"."id"
Я не знаю, почему id
включен в этот запрос.
Запрос, который я хочу использовать, выглядит следующим образом:
SELECT "example_table"."category", COUNT("example_table"."category") AS "category__count"
FROM "example_table"
GROUP BY "example_table"."category"
Используйте .order_by(…)
[Django-doc]:
from django.db.models import Count
result = Model1.objects.values('category').annotate(
Count('sns_type')
).order_by('category')
That being said, repeating the same category as a CharField
is usually not a good idea. Usually one works with a ForeignKey
to a Category
model as part of database normalization [wiki]:
class Category(models.Model):
name = models.CharField(max_length=32)
class Model1(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
name = models.CharField(max_length=32)
Затем вы делаете запрос с:
from django.db.models import Count
Category.objects.annotate(model1_count=Count('model1'))