2014-10-02 71 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' 
)