如何在Django中动态更新模型?

3 投票
2 回答
891 浏览
提问于 2025-04-18 00:02

我想把一个CSV文件的数据填充到我的Django模型里。我用numpy上传这个CSV文件,然后因为我的模型字段的名字和CSV的列标题是一样的,所以我想做类似这样的事情:

data=np.genfromtxt("file.csv", delimiter=',', dtype=None, names=True)
columns = data.dtype.names
for i in range(len(data['id'])):
    for a in range(1, len(columns)): #1 
        p=MyModel.objects.filter(columns[a]=data[i][columns[a]])
            p.save()

但是,这样做有点粗糙,而且不管用,因为我不能用columns[a]来代替字段名。

我甚至试过像这样写:MyModel._meta_fields[a]=data[i][a].

我有几十个甚至上百个字段,有时候:难道没有一种优雅的解决方案,可以让我省去写一长串字段名的麻烦吗?

谢谢!

2 个回答

1

你可以考虑先创建一个字典,把你想传递的参数放进去,然后用 ** 这个符号把字典里的内容作为参数传给函数。

column_args_dict = {columns[a]: data[i][columns[a]]}
p = MyModel.objects.filter(**column_args_dict)
3

如果你想从数据的每一行创建你模型的新实例,可以使用 setattr 函数来设置这些值:

data=np.genfromtxt("file.csv", delimiter=',', dtype=None, names=True)
columns = data.dtype.names
for i in range(len(data['id'])):
    p = MyModel()
    for a in range(1, len(columns)): #1
        if hasattr(p, columns[a]):
            setattr(p, columns[a], data[i][columns[a]])
        else:
            raise AttributeError("'MyModel' object has no attribute '{0}'".format(columns[a]))
    p.save()

撰写回答