2014-06-30 41 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()