2014-10-02 109 views
2

保存模型時,避免多次查詢,讓我們假設我有3種型號:一個Ç,與具有兩個一個外鍵關係Ç B。 如何在保存C模型時如何避免多個查詢?如果我有必要的信息來檢索ABDjango的ORM:與外鍵關係

目前我的代碼是一樣的東西:

a = A.objects.get(title='the title', platform='the platform') 
b = A.objects.get(id='the id') 
C.objects.update_or_create(a=a, b=b, defaults={'c_param_1':'value'}) 

這吮吸,因爲它至少執行3個查詢(4如果C對象不存在)。 我想檢索ab在db層...如何使用Django的ORM實現?

我目前試圖以這種方式用Q對象:

C.objects.update_or_create(
     a=Q(a__title='the title') & Q(a__platform='the platform'), 
     b=Q(b__id='the id'), 
     c_param_1='value' 
) 

,但我得到:

TypeError: int() argument must be a string or a number, not 'Q' 

PS:我使用Django 1.7

回答

1

好吧,既然外鍵實際上是它所反對的對象的id,你必須運行一個查詢來獲得這個id。但是,如果你已經有父對象的id,你可以創建一個沒有完全加載父對象的子對象:

C.objects.update_or_create(
    a_id=id_of_a, 
    b_id=id_of_b, 
    c_param_1='value' 
)