2016-12-01 64 views
1

如何在DateTimeField上加入兩個模型?Django:加入DateTimeField

class ExchangeRate(models.Model): 
    date = models.DateTimeField(...) 
    usd_rub = models.DecimalField(...) 

class LedgerEntry(models.Model): 
    account = models.ForeignKey(...) 
    date = models.DateTimeField(...) 
    amount = models.DecimalField(...) 

這是我想要的一個例子。請注意,ExchangeRate表中的記錄具有任意日期和時間(與LedgerEntry表中的日期不相對應)。沒關係加盟只是日期或時間ExchangeRates(它是安全的忽視,分,秒等)

 ExchangeRate      LedgerEntry    
–––––––––––––––––––––––––––- –––––––––––––––––––––––––––--------- 
|  Date  | USD_RUB | | account |  Date  | Amount | 
|---------------|----------| |–––––––––|---------------|--------| 
| 29 Nov, 14:15 | 100.00 | | 13 | 29 Nov, 14:40 | 10.0 | 
| 29 Nov, 14:04 | 200.00 | | 37 | 29 Nov, 14:45 | 11.0 | 
| 29 Nov, 13:51 | 150.00 | | 19 | 01 Oct, 10:32 | 12.0 | 
| ............. | .........| –––––––––––––––––––––––––––--------- 
| 01 Oct, 10:23 | 500.00 | 
–––––––––––––––––––––––––––- 

          Join result        
–––––––––––––––––––––––––––------------------------------------- 
| account |  Date  | Amount | USD_RUB | USD_RUB amount | 
|–––––––––|---------------|--------|----------|----------------| 
| 13 | 29 Nov, 14:40 | 10.0 | 100.00 | 1000.0  | 
| 37 | 29 Nov, 14:45 | 11.0 | 100.00 | 1100.0  | 
| 19 | 01 Oct, 10:32 | 12.0 | 500.00 | 6000.0  | 
–––––––––––––––––––––––––––------------------------------------- 

我明白,我可以查詢數據庫中的所有這些對象和Python的「加盟」他們。數據庫中有數千條記錄,所以這實際上是效率低下的,因爲當爲分類賬條目查找相應的匯率時,它會產生大量的單一選擇語句。

回答

0

起初我想進行左轉使用原始的SQL加入,但我已經想通了使用extra()一個解決方案:

referral_profits = LedgerEntry.objects.filter(
    balance=request.user.balance, 
    reason=LedgerEntry.REASON_DEBIT 
).extra(
    select={ 'usd_value': r''' 
     SELECT usd_rub 
     FROM stats_exchangerate 
     WHERE 
      date_trunc('hour', billing_ledgerentry.date) = 
      date_trunc('hour', stats_exchangerate.date) 
     LIMIT 1 
     ''' 
    }, 
) 
for x in referral_profits: 
    print(x, x.usd_value, x.date) 

請注意,date_trunc是Postgres-speficic功能。

編輯:它的工作原理,但它效率非常低。看起來最後的手段是使用純SQL?