假设我有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
答案 0 :(得分:1)
好吧,因为外键实际上是对象的id,所以你必须运行一个查询来获取这个id。但是,如果您已经拥有父对象的id,则可以创建一个没有完全加载父对象的子对象:
C.objects.update_or_create(
a_id=id_of_a,
b_id=id_of_b,
c_param_1='value'
)