【问题标题】:How to update dynamically a model in Django?如何在 Django 中动态更新模型?
【发布时间】:2014-05-05 09:50: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()

现在,这是一行,它不起作用,因为我不能传递该列 [a] 而不是字段名称。

我什至尝试过类似MyModel._meta_fields[a]=data[i][a].

有时,我有数十个甚至数百个字段:难道没有一个优雅的解决方案可以让我花时间编写一长串字段名称吗?

谢谢!

【问题讨论】:

    标签: python django csv numpy django-models


    【解决方案1】:

    如果您尝试从每一行数据创建模型的新实例,请使用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()
    

    【讨论】:

    • 实际上,我意识到如果我使用了错误的属性,我不会得到如果我使用p=MyModel.objects.filter(WRONG_ATTRIBUTE=whatever) 会得到的错误。有什么办法可以得到这个错误?
    • @foebu - 当然,在设置之前用hasattr检查它的存在。我已经更新了示例。
    • 最后,由于我想引发异常,我使用了 p._meta.get_field('wrong_attr')。谢谢你的帮助;)
    【解决方案2】:

    您可以考虑构建一个包含要传递的参数的字典,然后使用** 将字典作为这些参数提供给函数。

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

    【讨论】:

    • 我也会试试这个并更新评论..现在我可以使用 setattr 了。谢谢!
    猜你喜欢
    • 2013-03-12
    • 2014-03-27
    • 2018-12-05
    • 2016-12-18
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多