我有一个模特:
class MyModel(models.Model):
fieldA = models.IntegerField()
fieldB = models.IntegerField()
fieldC = models.IntegerField()
现在,让我们来一个QuerySet,例如
qs = MyModel.objects.all()
我希望能够使用相同的值更改fieldB
中所有实例的fieldC
和qs
,并将其保存为我的数据库中的新记录。我需要与qs.update(fieldB=2, fieldC=3)
类似的内容,但我不想覆盖qs
中的原始记录。是否有Django方式(即不涉及手动编码的for
循环)?
答案 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())
注意:
qs.values()
在qs
中为每个对象返回一个字典。
{pair[0]...}
表达式是一种词典理解,它创建一个新词典减去MyModel
上定义的主要字段。
MyModel(**...)
创建一个新的MyModel
对象,其主键设置为None
。它有效地创建了一个副本。
bulk_create
在一个查询中创建所有对象。它有caveats,应该知道。
如果需要提及,你在这里有dict和list comprehensions,而不是for
循环。