2010-01-04 48 views
0

我有多個模型都有一個FK到同一個模型。 我所知道的是FK,我如何確定哪些型號附有FK?用一個值查詢多個模型

下面一個例子來clearify:

class ModelA(models.Model): 
     title = models.CharField("title", max_length=80) 

class ModelB(models.Model): 
     fk = models.ForeignKey(ModelA) 

class ModelC(models.Model): 
     fk = models.ForeignKey(ModelA) 

我怎樣才能找出不使用try /除了在每個模型B或C是否有FK? (FK的只能是他們中的一個,在這種情況下,記錄我只加了兩個模型,但在現實世界中的應用程序有哪些有FK到MODELA車型多種可能的NOx量)

回答

0
if ModelB.objects.filter(fk=your_fk): 
    print "B" 
else: 
    print "C" 

如果您不確定這FK是否出現在B或C中的全部,添加其他檢查:

if ModelB.objects.filter(fk=your_fk): 
    print "B" 
elif ModelC.objects.filter(fk=your_fk): 
    print "C" 
else: 
    print "none" 
+0

。嘗試/除了什麼問題?你想使用單個數據庫查詢來檢查兩個結果嗎? – 2010-01-04 19:16:04

+0

讓我們假設我有20個模型,我不想嘗試/除了所有這些模型。我想知道是否有一種方法來查詢檢查結果的所有模型。否則,我必須製作一箇中間模型。 – swoei 2010-01-04 19:42:09

+0

你的意圖是什麼 - 時間優化(使一個複雜的請求,而不是20個簡單)或者只是一個句法方便? – 2010-01-04 21:00:05

0

如果像你說的,你有許多型號foreignkeys到ModelA也許你應該考慮在一個領域ModelA哪個緩存了這些信息?它可以通過save()方法ModelB/C/..或通過數據庫存儲過程進行更新。

+0

這個問題呢? – 2010-01-04 20:58:04

0

如果你以後語法糖和查詢的數量減少試試這個:

a=ModelA.objects.annotate(nb=Count('modelb'), nc=Count('modelc')).get(pd=your_fk) 
if a.nb: 
    return 'B' 
elif a.nc: 
    return 'C' 
else: 
    return 'A' 

但我覺得這是太相似了嘗試/除了你提到的(Django的> = V1.1)