如何从CSV文件更新Django表中的数据并保持主键值不变?

0 投票
1 回答
1637 浏览
提问于 2025-04-17 04:41

我有一个表格,里面已经有一些数据了。现在我想从一个csv文件中上传新数据,并且想更新这个表格里一些之前的值。我正在使用django 1.3和sqlite3作为数据库。但是我无法更新这个表格。

1 个回答

0

如果你不想改变主键的值,或者不想往表里添加可能和旧信息重复的新对象,那么你需要一些数据,可以用作在数据库中查找的参数。

如果你有一个模型来表示这些数据,那么使用起来就非常简单了。

m = Model.objects.get(somecolumn = somedata)
m.someothervalue = someotherdata
m.save()

但是,为什么要在这里提到Django呢?如果你有一个CSV表格,更新这些信息其实就是写一些查询语句。像Excel和OpenOffice这样的程序让这个过程变得非常简单。

如果你已经有CSV格式的数据,只需将数据打开为电子表格,然后使用Excel或OpenOffice的连接功能来创建更新查询。

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

如果你使用OpenOffice来处理这些数据,它还有一个很方便的“文本分列”功能(在程序菜单的“数据”下),可以把连接起来的值变成字符串。然后你可以把这些字符串复制粘贴到命令提示符或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)})

第一次使用时会创建一个新对象(Person)。但如果第二次使用时日期发生了变化,就会创建一个同名同姓但日期不同的新Person。

所以为了避免这种情况,你仍然需要做一些事情,比如:

obj.someothervalue = someotherdata
obj.save()

如果你想对可能发生变化的数据有更多的控制。

Alan.

撰写回答