#sql #django #join #django-models #count
#sql #django #Присоединиться #django-модели #количество
Вопрос:
Я пытаюсь преобразовать SQL-запрос в формат django, но поскольку я новичок в django, у меня возникли некоторые проблемы.
Мой запрос:
select make_name, count(*) as count from main_app_make as make
join main_app_model as model on make.id = model.make_id
join main_app_vehicle as vehicle on model.id = vehicle.model_id
group by make.make_name
Результат:
Audi 1
Mercedes-Benz 2
Мои модели:
class Make(models.Model):
make_name = models.CharField(max_length=50)
make_logo = models.CharField(max_length=400)
def __str__(self):
return self.make_name
class Model(models.Model):
model_name = models.CharField(max_length=50)
make = models.ForeignKey(Make, on_delete=models.CASCADE)
def __str__(self):
return self.model_name
class Vehicle(models.Model):
type = models.ForeignKey(VehicleType, on_delete=models.CASCADE)
model = models.ForeignKey(Model, on_delete=models.CASCADE)
body_type = models.ForeignKey(Body, on_delete=models.CASCADE)
...
Это то, что я пробовал:
options = Make.objects.all().values('make_name').annotate(total=Count('make_name'))
Комментарии:
1. Запрос ORM мне кажется прекрасным, что вы получили, когда попробовали?
2. Я получаю
Audi 1 Mercedes-Benz 1
3. Что произойдет, если вы попробуете:
options = Make.objects.prefetch_related('model_set__vehicle_set').values('make_name').annotate(total=Count('make_name'))
?4.
SELECT `main_app_make`.`make_name`, COUNT(`main_app_make`.`make_name`) AS `total` FROM `main_app_make` GROUP BY `main_app_make`.`make_name` ORDER BY NULL
Этот запрос генерируется, и я по-прежнему получаю тот же результат, что и выше.
Ответ №1:
Я думаю, вам нужно включить дочерние модели в Count
:
options = Make.objects.values('make_name').annotate(total=Count('model_set__vehicle_set'))
Ссылка: https://docs.djangoproject.com/en/stable/topics/db/aggregation/#following-relationships-backwards