从现有模型实例创建新模型实例

时间:2014-10-01 14:52:24

标签: django django-models

我有一个模特:

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

现在,让我们来一个QuerySet,例如

qs = MyModel.objects.all()

我希望能够使用相同的值更改fieldB中所有实例的fieldCqs,并将其保存为我的数据库中的新记录。我需要与qs.update(fieldB=2, fieldC=3)类似的内容,但我不想覆盖qs中的原始记录。是否有Django方式(即不涉及手动编码的for循环)?

1 个答案:

答案 0 :(得分: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,应该知道。

  5. 如果需要提及,你在这里有dict和list comprehensions,而不是for循环。