Django忽略了关于构造模型

时间:2016-03-02 11:30:30

标签: python django django-models constructor

我有一个小的Django项目,我从外部源获取一些信息并用它来构建模型实例。问题是,消息来源返回了很多(我的意思很多!)我不需要的额外信息。

目前我不得不弄清楚哪些额外的记录在那里并手动浏览并删除每个记录。但这并不是很好,因为

  1. 这使得代码非常难看,
  2. 如果外部来源发生变化,例如它添加了一个新字段,我的代码在构建模型时会抛出错误

    myModel = MyModel(**argDict)
    
  3. 有没有办法可以将过度完整的argDict传递给我的模型并让它抑制有关额外信息的任何错误并将其丢弃?我当时认为我可以使用pre_init信号但是我仍然不知道如何阻止该错误被发回。

3 个答案:

答案 0 :(得分:3)

meta API通过get_fields()提供所有可用字段实例的列表。您可以编写一个实用程序函数来过滤init的kwargs:

def init_kwargs(model, arg_dict):
    return {
        k: v for k, v in kwargs.iteritems() if k in [
           f.name for f in model._meta.get_fields()
        ]
    }

然后,

kwars = init_kwargs(myModel, arg_dict)
myModel = MyModel(**kwargs)

适用于所有型号。

答案 1 :(得分:2)

创建一个没有任何参数的空白实例。然后使用setattr设置值。您不应该为模型上不存在的字段获取任何错误。

my_model = MyModel()
for key, value in argDict.items():
    setattr(my_model, key, value)
my_model.save()

您可以将上述代码包装在可重用性的函数中,也许是自定义管理器上的方法。

答案 2 :(得分:1)

我需要改变接受的答案才能使其发挥作用(Python 3.6.3):

def init_kwargs(model, arg_dict):
return {
    k: v for k, v in arg_dict.items() if k in [
       f.name for f in model._meta.get_fields()
    ]
}