我在Flask中构建应用程序,并且我定义了几个SQLAlchemy模型。我有一个字典,其中包含每个模型类型的键/值对。
我想要一个使用字典的通用插入...这需要一个映射器吗?我知道wtforms.ext.sqlalchemy.orm.model_form()使用populate_obj(model)生成一个对象,所以它是可能的。我已经梳理了文档,但无法找到它。我可以稍后执行提交,但需要一个快捷方式来填充对象。请问,有没有人有专业知识?
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)
employee_data = {'firstname':'John','lastname':'Smith'}
project_data = {'name':'project1'}
dict_generalised_insert(model=Employee,dictionary=employee_data)
dict_generalised_insert(model=Project,dictionary=project_data)
def dict_generalised_insert(model=None,dictionary={})
obj = model.model()
obj.populate_obj(dictionary) # ???
return obj
class Employee(db.Model):
id = db.Column(db.Integer, primary_key=True)
firstname = db.Column(db.String(80))
lastname = db.Column(db.String(80))
class Project(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
答案 0 :(得分:21)
解包字典的惯用方法是使用双星运算符**
。
与flask-sqlalchemy
:
class Employee(db.Model)
id = db.Column(...)
firstname = db.Column(...)
lastname = db.Column(...)
employee_data = {'firstname':'John','lastname':'Smith'}
employee = Employee(**employee_data)
db.session.add(employee)
db.session.commit()
请注意字典中的键必须与类的属性名称匹配。以这种方式解包与以下内容相同:
employee = Employee(firstname='John', lastname='Smith')
如果使用位置参数定义__init__
(或其他方法),您也可以使用列表执行此操作,但是您只使用一个星号:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
employee_data = ['John', 'Smith']
employee = Employee(*employee_data)
...
请注意,值的顺序非常重要。