Django 忽略构建模型的额外参数

JMz*_*nce 5 python django constructor django-models

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

目前,我必须弄清楚那里有哪些额外的记录,然后手动检查并删除每个记录。但这不是很好,因为

  1. 它产生了非常丑陋的代码和
  2. 如果外部源发生变化,例如它添加了一个新字段,我的代码将在构建模型时抛出错误

    myModel = MyModel(**argDict)
    
    Run Code Online (Sandbox Code Playgroud)

有没有办法可以将过度完成传递argDict给我的模型并让它抑制有关额外信息的任何错误并丢弃它?我在想我可以使用pre_init信号,但后来我仍然不知道如何停止返回该错误。

sch*_*ggl 7

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

def init_kwargs(model, arg_dict):
    model_fields = [f.name for f in model._meta.get_fields()]
    return {k: v for k, v in arg_dict.iteritems() if k in model_fields}
Run Code Online (Sandbox Code Playgroud)

然后,

kwars = init_kwargs(myModel, arg_dict)
myModel = MyModel(**kwargs)
Run Code Online (Sandbox Code Playgroud)

将适用于所有型号。

  • 对于Python3:用arg_dict.items()替换arg_dict.iteritems() (3认同)