【问题标题】:Joining and iterating through foreign-key tables with Django使用 Django 连接和遍历外键表
【发布时间】:2018-10-01 20:38:09
【问题描述】:

我有以下 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_stockmyapp_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

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    您需要使用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)
    

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 2010-11-04
      • 1970-01-01
      • 2022-06-10
      • 2012-03-29
      • 2015-04-16
      • 2018-06-24
      • 2017-07-31
      • 2020-10-08
      相关资源
      最近更新 更多