2014-10-01 39 views
0

我有一个模型:创建从现有的新模型实例

class MyModel(models.Model): 
    fieldA = models.IntegerField() 
    fieldB = models.IntegerField() 
    fieldC = models.IntegerField() 

现在,让我们得到一个QuerySet,例如

qs = MyModel.objects.all() 

我希望能够改变所有实例的fieldBfieldCqs具有相同的值,并将其保存为我的数据库中的新记录。我需要类似于qs.update(fieldB=2, fieldC=3)的东西,但我不想覆盖qs中的原始记录。是否有Django方法可以这样做(即,不涉及手动编码的for循环)?

+0

不知道我如何标记重复(本网站的新增内容),但您的答案在这里:http://stackoverflow.com/questions/4733609/how-do-i-clone-a-django-model-instance-对象并保存到数据库 – michaelb 2014-10-01 14:55:23

+0

谢谢,但适用于单个实例,是否有办法为所有实例执行此操作? (再次,除了通常的'for'循环之外,可能是用单个查询插入所有记录的东西)。 – Sirion 2014-10-01 15:03:34

回答

0

我不知道一个Django调用会在一次调用中做你想做的事情,就像update那样。

这是我能够最接近的。假设你想操作的对象是qs则:

MyModel.objects.bulk_create(
    MyModel(**{pair[0]: pair[1] for pair in x.iteritems() 
       if pair[0] != MyModel._meta.pk.name}) 
    for x in qs.values()) 

注:

  1. qs.values()回报每个对象一个辞典qs

  2. {pair[0]...}表达式是一种字典理解,它创建一个新的字典减去在MyModel上定义的主字段。

  3. MyModel(**...)创建一个新的MyModel对象,其主键设置为None。它有效地创建一个副本。

  4. bulk_create在一个查询中创建所有对象。它应该知道的caveats

如果需要提及的话,这里有的是字典和列表解析,而不是for循环。

相关问题