我需要将数据从一个数据库导出到另一个数据库。数据对象需要映射到字典。
每行需要使用不同的值保存两次foobar = [' foo',' bar']。
foobar=['foo','bar']
data = []
for q in queryset:
row = {"id": q.id,
"created_at": q.created_at}
for f in foobar:
row['index'] = f
data.append(row)
bulksave(data)
这并没有给出所需的结果:
print data
[{'id': 1, 'created_at': '2017-01-01', 'index': 'bar'},
{'id': 2, 'created_at': '2017-01-02', 'index': 'bar'}]
期望的输出将具有' foo'和' bar'作为指数。 我如何让它工作? 采取不同的方法将循环不同:
for f in foobar:
for q in queryset
这可行,但需要两倍的时间,因为查询集中的每个元素都将被评估两次。
答案 0 :(得分:1)
问题在于内循环。您不断更新相同的dict
并将其重新添加到data
。 data
最终会对同一个dict
进行多次引用,而dict
已更新为foobar
中的最后一个值。
只需在添加前复制。另外,关于写好问题的说明......如果可能的话,你想要一个可运行的例子。在这里,我模仿queryset
,以便运行。
class Mock:
def __init__(self, id, created_at):
self.id = id
self.created_at = created_at
queryset = [Mock(1, '2017-01-01'), Mock(2, '2017-01-02')]
foobar=['foo','bar']
data = []
for q in queryset:
row = {"id": q.id,
"created_at": q.created_at}
for f in foobar:
row['index'] = f
data.append(row.copy())
bulksave(data)
<强>更新强>
如果您真的想让下一个人混淆查看您的代码,请将其全部折叠为
import itertools
class Mock:
def __init__(self, id, created_at):
self.id = id
self.created_at = created_at
queryset = [Mock(1, '2017-01-01'), Mock(2, '2017-01-02')]
foobar=['foo','bar']
bulkupdate(list(dict(zip(('id', 'created_at', 'index'), (q.id, q.created_at, index)))
for q, index in itertools.product(queryset, foobar)))
(dgg32
现已删除的帖子让我思考......)