我有以下2个Django模型:
from django.db import models
class Stock(models.Model):
symbol = models.CharField(db_index=True, max_length=5, null=False, editable=False, unique=True)
class PriceHistory(models.Model):
stock = models.ForeignKey(Stock, related_name='StockHistory_stock', editable=False)
trading_date = models.DateField(db_index=True, null=False, editable=False)
price = models.DecimalField(max_digits=12, db_index=True, decimal_places=5, null=False, editable=False)
class Meta:
unique_together = ('stock', 'date')
显然,这会导致创建两个数据库表:myapp_stock
和myapp_pricehistory
。这些表分别有2列和4列。第一个表包含数千行。第二个表包含数百万行。
我想加入表格,对结果行进行排序,并逐行遍历这些行进行打印。这就是我打算这样做的方式:
for i in PriceHistory.object.all().order_by('stock__symbol', 'trading_date'):
print '{} {}: {}'.format(i.stock.symbol, i.trading_date, i.price)
这是最有效的方法来最小化对数据库的调用吗?我希望它只运行一个SQL查询。我担心上面的代码每次进入for循环时都会对myapp_stock
表运行一个单独的查询。这个问题是否有效?如果是这样,如何避免?
基本上,我知道理想的SQL看起来像这样。我怎样才能让Django执行类似的东西?:
select
s.symbol,
ph.trading_date,
ph.price
from
myapp_stock as s,
myapp_pricehistory as ph
where
ph.stock_id=s.id
order by
s.symbol asc,
ph.trading_date asc
答案 0 :(得分:0)
您需要使用select_related
来避免对循环中的每个项目进行额外查询:
histories = PriceHistory.objects.all().select_related('stock')\
.order_by('stock__symbol', 'trading_date')
for i in histories:
print '{} {}: {}'.format(i.stock.symbol, i.trading_date, i.price)