簡體   English   中英

使用Django連接和遍歷外鍵表

[英]Joining and iterating through foreign-key tables with Django

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM