姜戈。如何获取 JOIN 查询和 GROUP BY 中的所有字段
Django. How to get all fields in JOIN query and GROUP BY it all
我需要 JOIN 两个 table,并通过 id
摸索并通过某些字段获得两个聚合函数:
models.py
class Products(models.Model):
brand = models.CharField(max_length=45, blank=True, null=True)
name = models.CharField(max_length=45, blank=True, null=True)
cluster = models.CharField(max_length=45, blank=True, null=True)
target_market = models.CharField(max_length=10, blank=True, null=True)
class Vardata(models.Model):
month = models.DateField(blank=True, null=True)
sales_units = models.IntegerField(blank=True, null=True)
price = models.FloatField(blank=True, null=True)
fk_products = models.ForeignKey(MntProducts, models.DO_NOTHING, db_column='fk_products', blank=True, null=True)
数据:
Products.objects.all()
('vendor1', 'name1', 'it', 'C') #id-12
('vendor2', 'name2', 'it', 'B') #id-13
('vendor3', 'name3', 'bc', 'B') #id-14
.....
Vardata.objects.all()
('2020-03-01', '20', '180', '12')
('2020-04-01', '15', '182', '12')
('2020-05-01', '10', '178', '12')
('2020-03-01', '30', '120', '13')
('2020-04-01', '35', '122', '13')
('2020-05-01', '10', '118', '13')
('2020-03-01', '20', '150', '14')
('2020-04-01', '15', '155', '14')
('2020-05-01', '10', '156', '14')
我需要退出:
exit[0]
{'id': 12,
'brand': 'vendor1',
'name': 'name1',
'cluster': 'it',
'target_market': 'C',
'sum__sales_units': 540,
'avg__price': 180
}
我尝试从数据库 INNER JOIN
SQL 查询 table 到 QuerySet
的所有字段;之后使用 annotate(Sum('sales_units', Avg('price'))
到 QuerySet
:
但我的查询不采用查询中父 table(产品)的字段
views.py
qry_total_execute = Vradata.objects.select_related("fk_products").filter(fk_products__in=list_products)
>>> qry_total_execute.query('SELECT `vardata`.`id`, `vardata`.`month`, `vardata`.`sales_units`, vardata`.`price_rur`, `vardata`.`fk_products`, `products`.`id`, `products`.`brand`, `products`.`name`, `products`.`cluster`, `products`.`target_market` FROM `vardata` INNER JOIN `products` ON (`vardata`.`fk_products` = `products`.`id`) WHERE `vardata`.`fk_products` IN (12, 13, 14)
它写
QuerySet
具有正确数量的记录,但没有来自 products
的字段仅来自 vardata
(使用此 SQL 查询 MySQL 手动给出正确的结果与所有需要的字段。)
提问:
- 如何从展位数据库中获取所有字段?
- 如果我得到
qry_total_execute
的正确结果,如何正确使用聚合?
qry_total_execute.values('id', 'brand', 'name', 'cluster', 'target_market').'annotate(Sum('sales_units', Avg('price'))
这样做对吗?
不要用模型Vardata
,让用Products
直接放annotate
qry_total_execute = Products.objects.filter(id__in=list_products).\
annotate(Sum(vardata__sales_units), Avg(vardata__price).\
values()
我需要 JOIN 两个 table,并通过 id
摸索并通过某些字段获得两个聚合函数:
models.py
class Products(models.Model):
brand = models.CharField(max_length=45, blank=True, null=True)
name = models.CharField(max_length=45, blank=True, null=True)
cluster = models.CharField(max_length=45, blank=True, null=True)
target_market = models.CharField(max_length=10, blank=True, null=True)
class Vardata(models.Model):
month = models.DateField(blank=True, null=True)
sales_units = models.IntegerField(blank=True, null=True)
price = models.FloatField(blank=True, null=True)
fk_products = models.ForeignKey(MntProducts, models.DO_NOTHING, db_column='fk_products', blank=True, null=True)
数据:
Products.objects.all()
('vendor1', 'name1', 'it', 'C') #id-12
('vendor2', 'name2', 'it', 'B') #id-13
('vendor3', 'name3', 'bc', 'B') #id-14
.....
Vardata.objects.all()
('2020-03-01', '20', '180', '12')
('2020-04-01', '15', '182', '12')
('2020-05-01', '10', '178', '12')
('2020-03-01', '30', '120', '13')
('2020-04-01', '35', '122', '13')
('2020-05-01', '10', '118', '13')
('2020-03-01', '20', '150', '14')
('2020-04-01', '15', '155', '14')
('2020-05-01', '10', '156', '14')
我需要退出:
exit[0]
{'id': 12,
'brand': 'vendor1',
'name': 'name1',
'cluster': 'it',
'target_market': 'C',
'sum__sales_units': 540,
'avg__price': 180
}
我尝试从数据库 INNER JOIN
SQL 查询 table 到 QuerySet
的所有字段;之后使用 annotate(Sum('sales_units', Avg('price'))
到 QuerySet
:
但我的查询不采用查询中父 table(产品)的字段
views.py
qry_total_execute = Vradata.objects.select_related("fk_products").filter(fk_products__in=list_products)
>>> qry_total_execute.query('SELECT `vardata`.`id`, `vardata`.`month`, `vardata`.`sales_units`, vardata`.`price_rur`, `vardata`.`fk_products`, `products`.`id`, `products`.`brand`, `products`.`name`, `products`.`cluster`, `products`.`target_market` FROM `vardata` INNER JOIN `products` ON (`vardata`.`fk_products` = `products`.`id`) WHERE `vardata`.`fk_products` IN (12, 13, 14)
它写
QuerySet
具有正确数量的记录,但没有来自 products
的字段仅来自 vardata
(使用此 SQL 查询 MySQL 手动给出正确的结果与所有需要的字段。)
提问:
- 如何从展位数据库中获取所有字段?
- 如果我得到
qry_total_execute
的正确结果,如何正确使用聚合?
qry_total_execute.values('id', 'brand', 'name', 'cluster', 'target_market').'annotate(Sum('sales_units', Avg('price'))
这样做对吗?
不要用模型Vardata
,让用Products
直接放annotate
qry_total_execute = Products.objects.filter(id__in=list_products).\
annotate(Sum(vardata__sales_units), Avg(vardata__price).\
values()