Преобразовать SQL-запрос в формат модели Django

#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