Django ORM:在保存具有外键关系的模型时避免多次查询

时间:2014-10-02 09:37:09

标签: python django performance django-models orm

假设我有3个模型: A B C C 具有外键关系同时 A B 。 如果我有必要的信息来检索 A B ,那么在保存 C 模型时如何避免多次查询?

目前我的代码类似于:

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次查询(如果C对象不存在,则为4次)。 我想在db层检索 a b ...如何使用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 个答案:

答案 0 :(得分:1)

好吧,因为外键实际上是对象的id,所以你必须运行一个查询来获取这个id。但是,如果您已经拥有父对象的id,则可以创建一个没有完全加载父对象的子对象:

C.objects.update_or_create(
    a_id=id_of_a, 
    b_id=id_of_b,
    c_param_1='value'
)
相关问题