Python 在Django脚本中将数据保存到列而不删除其他列

Python 在Django脚本中将数据保存到列而不删除其他列,python,django,Python,Django,我有一个如下形式的模型: class Data(models.Model): some_id = models.IntegerField(primary_key=True) data1 = models.IntegerField() data2 = models.IntegerField() data3 = models.CharField(max_length=150) 我正在从各种文件中读取数据,并使用标题信息来确定所述文件中的列应该保存在哪里。数据库中的每

我有一个如下形式的模型:

class Data(models.Model):
    some_id = models.IntegerField(primary_key=True)
    data1 = models.IntegerField()
    data2 = models.IntegerField()
    data3 = models.CharField(max_length=150)
我正在从各种文件中读取数据,并使用标题信息来确定所述文件中的列应该保存在哪里。数据库中的每个列名都是唯一的,因此我也使用它们来指向相应的表

在某些情况下,数据库中的给定行已经包含包含数据的列,我需要向其他列添加数据。为此,我在Django shell中运行python代码。但是,如果我为现有元素指定一个pk或“some_id”以将数据保存到一列中,则该行中所有其他列的数据将被覆盖为无。例如,如果我的代码读取

data_args = {}
data_args['some_id'] = 0
data_args['data2'] = 100

data_entry = Data(**data_args)

data_entry.save()
并且该条目的data1和data3已经填充,在save()之后,它们将不读取任何内容

因为我是从脚本运行此操作的,而我的列名是从标题中读取为字符串的,所以我无法理解如何以文档中示例的形式更新数据,例如:

data_entry = Data.objects.get(some_id=0)
data_entry.data2=100
data_entry.save()
虽然这可以从命令行执行,但当从文件头将“data2”作为字符串读取时,不会从python代码执行

编辑:对不够清晰表示歉意。我想省去一些血淋淋的细节。当我说上述(正确的)代码在我的脚本中不起作用时,我从一个文件头访问列“data2”的名称,该文件头如下所示:

some_id|data1|data2|data3
我使用numpy.genfromtxt解析文件中的数据,该文件提供对以下表单中数据列名称的访问:

data_array.dtype.names = ('some_id', 'data1', 'data2', 'data3')
假设数据中的第一个条目已经存在,如果我试图保存到没有数据的列中

single_arg = data_array.dtype.names[2]
data_entry = Data.objects.get(some_id=0)
data_entry.single_arg = 100
data_entry.save()
值100最终不会保存到第一个条目的“data2”列中。我得到的价值仍然是零。在执行此操作的循环中,在save()之前,我打印了single_arg(在本例中显示data2)、包含我试图分配给data_entry.single_arg(在本例中为100)的值的变量以及data_entry.single_arg本身(在本例中应为100),它们看起来都是正确的

但是,由于某些原因,该值不会保存到数据库中。如果上面的代码是正确的,那么也许我的问题确实存在于其他地方

进一步编辑:

正如我所想的,问题似乎是当在data_entry.single_arg中使用时,single_arg没有注册为“data2”。在save()之后,如果我重新查询数据库并尝试打印应该保存的内容:

data_entry = Data.objects.get(some_id=0)
single_arg = data_array.dtype.names[2]
print data_entry.single_arg
我得到一个错误:

AttributeError: 'Data' object has no attribute 'single_arg'
因此,可能是在脚本中,整个字符串“data_entry.single_arg”的值为100,而实际上根本没有访问对象data_entry.data2。也许吧


因此,我的问题是,如何将数据保存到一列(或多列)中,同时将现有数据保存在同一行的其他列中?

您的问题的一般答案是

data_entry = Data(**data_args)
data_entry.save()
您正在将新记录保存到数据库中;任何未填充的值都将获得默认值或NULL,具体取决于模型字段定义。要修改现有记录,必须首先从数据库中检索它,如第二段代码所示:

data_entry = Data.objects.get(some_id=0) # populates data_entry object with values from db
data_entry.data2=100
data_entry.save()
如果在您的脚本中,此代码似乎覆盖了您现有的值,则会出现其他问题。我建议您在第一次从数据库检索对象时打印出对象的值,因为这可能会揭示问题进一步存在于上游。打印所有模型实例值的便捷方法是:

print data_entry.__dict__

您将属性查找与
getattr
混淆。您无法通过键入
数据将字符串解析为属性。single_arg
-python如何知道是使用变量值还是属性名称

single_arg = 'data2'
data.single_arg = 100

# you can NOT set an attribute by a string this way. 
# You're just setting an attribute called single_arg to 100 which isn't a model 
# field, so it's not going to be saved.
要通过字符串设置属性,需要使用
setattr

single_arg = 'data2'
data = Data.objects.get(id=1)
setattr(data, single_arg, 100)
data.save()

你的最后一个例子和预期的一样<代码>数据项没有
单个参数
属性。如果要在变量
single\u arg
中引用字符串属性,则需要调用
getattr(data\u entry,single\u arg)
,“当'data2'从文件头读取为字符串时”是什么意思?你能举一个这样做的代码的例子吗?正如Dave和Brian所说,您的第二个示例是正确的,因此问题一定在其他地方。谢谢。这就是我要找的。我很高兴它有帮助。我想知道这个“单身”是什么。。然后我想到了你想做的事。