如何从csv文件更新django表中的数据,同时保持主键值不变。

时间:2011-10-20 09:16:57

标签: python django sqlite

我有一个表已经包含了一些数据。现在我想从csv文件上传新数据,并希望更新该表的某些先前值。我使用django 1.3和sqlite3作为数据库。但是我无法更新表格。

1 个答案:

答案 0 :(得分:0)

如果您不想更改Primay键值或不向表中添加新对象(可能是旧信息的副本),那么您需要某种数据,可以将其用作数据库中的查找参数。

如果您有代表此数据的模型,那么使用

非常容易
m = Model.objects.get(somecolumn = somedata)
m.someothervalue = someotherdata
m.save()

但是为什么还要包括django呢?如果您有CSV表,那么更新此信息实际上是编写查询的情况。像Excel和openoffice这样的程序使这很容易。 如果您已经有CSV格式的数据,那么只需将数据打开为电子表格并使用excels / openoffice的Concactenate函数创建更新查询

Update mytable set value1 = data1, value2 = data2 where somevalue = somedata;

如果您使用openoffice,那么openoffice有这个漂亮的Text to columns函数(在程序菜单中的数据下),它将concactenated值转换为字符串。然后你可以将这些字符串复制到命令提示符或phppgadmin并运行..瞧,你得到数据库中的更新数据。

编辑(回复你的评论。):

请注意:https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create

如果你想为此使用django,那么使用get_or_create。但是你需要记住,如果你在get_or_create方法中使用的任何参数已经改变,那么将创建新对象。这就是为什么我在帖子开头说,你需要一些不会改变的数据。

例如

(取自上面的链接)

obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon',
                  defaults={'birthday': date(1940, 10, 9)})
第一次使用时,

会创建新的obj(Person)。但如果第二次使用且日期已更改,则将创建具有相同名称和姓氏但新日期的新人。

所以为了避免这种情况,你仍然需要做类似

的事情
obj.someothervalue = someotherdata
obj.save()

如果您想要对数据进行更多控制,那可能已经改变了。

艾伦。