【发布时间】: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