2016-02-04 33 views
0

我有以下型号:Django的:复制和更新查询集

class A(models.Model): 
    pass 

class B(models.Model): 
    a = models.ForeignKey(A, related_name="bs") 

然后我有,我创建对象A的新纪录功能,我想给所有相关的记录复制的B

我做了一些事,如

def foo(new_a, old_a): 
    old_a.bs.all().update(pk=None, a=new_a) 

,但我得到以下错误 ERROR - failed to write data to stream: <open file '<stdout>', mode 'w' at 0x7f207949a150>

回答

3

做这样的事情

def foo(new_a, old_a): 
    old_a.bs.all().update(pk=None) 

将尝试设置pk=None上的所有bsold_a这是不是你想要的。

相反,你会想要做的事,如:

for b in old_a.bs.all(): 
    b.pk = None # make sure you're not overwriting the existing record 
    b.a = new_a 
    b.save() 

我想你也应该能够使用bulk_create更有效地做到这一点:

new_bs = [] 
for b in old_a.bs.all(): 
    b.pk = None # make sure you're not overwriting the existing record 
    b.a = new_a 
    new_bs.append(b) 

B.objects.bulk_create(new_bs) 
+0

的完美谢谢 – Alexis

8

希望有所帮助:

query_set = B.objects.filter(something=a).values() 

for k in query_set: 
    A.objects.bulk_create(**k) 
+0

谢谢,除了我必须设置'new_a' – Alexis

+0

您的欢迎@亚历克斯 –