2014-06-30 37 views
0

我有以下型號:保存使用第二級相關領域的PK模型在Django

class A(models.Model): 
    pass # omitted for shortness 

class B(models.Model): 
    pass 

class AB(models.Model): 
    prop_a = models.ForeignKey('A') 
    prop_b = models.ForeignKey('B') 

class X(models.Model): 
    prop_ab = models.ForeignKey('AB') 

我要救實例X的模式,但沒有做ab = AB.objects.get(prop_a=1, prop_b=2)然後x.prop_ab = ab

我想是這樣的(假設所有在A適當的條目,BAB已經存在):

x = X() 
x.prop_ab__prop_a__id = 1 
x.prop_ab__prop_b__id = 2 
x.save() 

是這樣的可能嗎? (上面的語法是不行的,我試過)

+0

get你能解釋一下你正在努力實現這個東西,以儘量減少查詢我的號碼嗎? –

+0

我需要在foreach循環中做一堆'X'模型的'save()',所以我還需要在那個foreach中獲得'AB'條目。我想通過消除'AB'上的'get'來減少查詢次數。 –

+1

Afaik這是不可能的,類X需要類AB的PK,所以你必須做查詢查找來確定PK。但是,如果您已經知道PK,那麼您可以簡單地執行x.prop_ab_id = 1.但是您必須考慮您嘗試實現的優化可能不是非常有用,因爲插入/更新操作比選擇查詢要重得多。 – Peter

回答

0

假設所有在ABAB適當的條目已經存在

,你可以這樣做:

x = X() 
x.prop_ab.prop_a_id = 1 
x.prop_ab.prop_b_id = 2 
x.save() 

我需要在foreach循環中執行X模型的一堆save(),所以我還需要在該foreach中獲取各自的AB條目。我想通過消除對AB

for x in X.objects.select_related('prop_ab'): 
    x.prop_ab.prop_a_id = 1 
    x.prop_ab.prop_b_id = 2 
    x.save()