序幕:
这是SO中经常出现的问题:
我已经在SO文档中编写了一个示例,但由于文档将于2017年8月8日关闭,我将遵循这个广泛上升和讨论的元答案的建议,并将我的示例转换为自我回答的帖子.
当然,我也很乐意看到任何不同的方法!
题:
假设模型:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
Run Code Online (Sandbox Code Playgroud)
如何使用Django ORM在该模型上执行以下查询:
GROUP BY ... COUNT:
SELECT author, COUNT(author) AS count
FROM myapp_books GROUP BY author
Run Code Online (Sandbox Code Playgroud)GROUP BY ... SUM:
SELECT author, SUM (price) AS total_price
FROM myapp_books GROUP BY author
Run Code Online (Sandbox Code Playgroud)我将查询转移到django时遇到问题.在sqlite3中,它看起来像这样:
SELECT A, MIN(B), MAX(B) from table GROUP BY A
Run Code Online (Sandbox Code Playgroud)
这将从A输出唯一值,其中包含一系列来自B的值.有关如何处理此问题的任何提示?在django甚至可能吗?
请注意:这个问题是我几天前提出的这个问题的后续问题.它不是重复的.我正在尝试在Django中建模的SQL查询和我加载的虚拟数据之间存在轻微但显着的差异.
我正在编写一个Python/Django应用程序来进行一些库存分析.
我有两个非常简单的模型,如下所示:
class Stock(models.Model):
symbol = models.CharField(db_index=True, max_length=5, null=False, editable=False, unique=True)
class StockHistory(models.Model):
stock = models.ForeignKey(Stock, related_name='StockHistory_stock', editable=False)
trading_date = models.DateField(db_index=True, null=False, editable=False)
close = models.DecimalField(max_digits=12, db_index=True, decimal_places=5, null=False, editable=False)
class Meta:
unique_together = ('stock', 'trading_date')
Run Code Online (Sandbox Code Playgroud)
这是我填充的虚拟数据:
import datetime
a = Stock.objects.create(symbol='A')
b = Stock.objects.create(symbol='B')
c = Stock.objects.create(symbol='C')
d = Stock.objects.create(symbol='D')
StockHistory.objects.create(trading_date=datetime.date(2018,1,1), close=200, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,1,2), close=150, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,1,3), close=120, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,4,28), close=105, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,5,2), close=105, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2018,5,3), close=105, stock=a)
StockHistory.objects.create(trading_date=datetime.date(2017,5,2), close=400, stock=b)
StockHistory.objects.create(trading_date=datetime.date(2017,11,11), close=200, stock=b) …Run Code Online (Sandbox Code Playgroud)