【问题标题】:Updates doesn't take affect in django orm, Is there something wrong in my code?更新在 django orm 中不起作用,我的代码有问题吗?
【发布时间】:2019-05-29 13:26:44
【问题描述】:

我需要在我的一个模型中更新url_field 中的多行,每个product_id 都有自己对应的要加载的新值。我的代码有什么问题?不返回任何错误。

idlist= ["",""]
url = ["https://www.sample.com","https://www.sample2.com"]
i = 0


while i < len(item_idlist):
Model.objects.filter(item_id=idlist[i].update(product_url=url[i]))
i += 1

我希望每次迭代都会更新模型内的数据。

【问题讨论】:

  • 您的代码是否与上面的缩进一样?请确保您在问题中缩进代码的方式与在您自己的项目中的缩进方式相同。
  • 另外,您在 idlist[i] 上执行 update(),而不是在过滤后的查询集上。
  • 而且你永远不会在 Python 中遍历这样的列表。 for 循环有什么问题?

标签: django orm django-2.1


【解决方案1】:

您可以将 for 循环与 zip 结合使用:

for id, url in zip(idlist, urls):
     m = Model.objects.filter(item_id=id)
     m.update(product_url = url)

【讨论】:

  • 不,filter 总是会给出一个查询集。
  • 非常感谢。
【解决方案2】:

小心你的括号。您的update() 应该在您的filter() 之后。不在里面。

您确定您的 idlist 吗?因为您正在使用空字符串进行过滤。所以你filter() 不会返回任何东西,也不会更新任何东西。

您可以像这样更新您的数据结构。将 id 与新 url 关联到字典中。

idlist_url = {
 1: "https://www.sample.com",
 2: "https://www.sample2.com"
}

for id, new_url in idlist.items():
    Model.objects.filter(item_id=id).update(product_url=new_url)

【讨论】:

  • 把while改成for item_id in item_idlist: ...
  • 或者更好,for item_id, product_url in zip(idlist, url)
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2015-05-29
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
相关资源
最近更新 更多