【问题标题】:Convert SQL query in Django model format以 Django 模型格式转换 SQL 查询
【发布时间】:2020-09-04 13:36:56
【问题描述】:

我正在尝试将 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'))

【问题讨论】:

  • ORM 查询对我来说似乎很好,您尝试后得到了什么?
  • 我收到Audi 1 Mercedes-Benz 1
  • 如果您尝试:options = Make.objects.prefetch_related('model_set__vehicle_set').values('make_name').annotate(total=Count('make_name')) 会发生什么?
  • 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 这个查询生成了,我仍然得到和上面一样的结果。

标签: sql django join django-models count


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 2020-11-14
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多