2012-12-11 280 views
0

我正在发出一个返回序列化数据的请求。我遍历数据并检查它是否存在于数据库中。如果存在则被忽略,如果不存在则保存。我遇到的问题是for循环仅保存第一条记录,即使它遍历数据的所有键并将其与数据库中的内容进行比较。我的代码如下:保存for循环的每次迭代

b = MyModel() 
data #The serialized data 
existingData = Off.object.filter(...) 

for key in data: 
    if existingData.filter(id_str=key['id_str']).exists(): 
     pass #If I place a print key['id_str'] here, all skipped items are printed. 
    else: 
     b.x = key['x'] 
     b.y = key['y'] 
     b.save() 

函数运行一个计数器每次被放置在else语句的底部b.save()后的计数器增加,但只有通过检查的第一个记录是保存和的休息数据中的项目不会被保存。我哪里错了?

+0

你怎么知道问题不在'MyModel.save'中? – mgilson

+0

有什么方法可以检查吗?当我第一次写这个只是为了测试它,我得到的数据回3次,并保存所有的键3次。现在我只保存1 :-( –

+2

接受一些其他的答案,然后我们会帮你的。 –

回答

2

首先你可能会覆盖相同b对象,而不是创建一个新的;我的意思是你检查一些id_str对象不存在,但你只是覆盖bxy属性。也许你需要做的是:

for item in data: 
    if not existingData.filter(id_str=item.get('id_str')).exists(): 
     MyModel.objects.create(id_str=item.get('id_str'), 
           x=item.get('x'), 
           y=item.get('y')) 

希望这有助于:)

干杯!

+0

这次我没有忘记接受。:-D谢谢你的帮助 –

+1

请注意,在循环中执行数据库操作通常是一个糟糕的主意,除非您可以绝对确定迭代次数会很慢,否则操作将有机会脱离您,并且真正放慢速度。想想未来的事情 –

+0

绝对是真的!+1 :) – Gerard