Tho*_*her 6 python constructor model sqlalchemy object
我想以这样的方式使用sqlalchemy:
email1 = EmailModel(email="user@domain.com", account=AccountModel(name="username"))
email2 = EmailModel(email="otheruser@domain.com", account=AccountModel(name="username"))
Run Code Online (Sandbox Code Playgroud)
通常sqlalchemy将为该帐户创建两个条目,并将每个电子邮件地址链接到此.如果我将帐户名设置为唯一sqlalchemy正在抛出一个异常,告诉我有一个具有相同值的条目已经存在.这一切都有意义,并按预期工作.
现在我想出了一个我自己的方法,允许提到的代码,只需通过覆盖AccountModel类的新构造函数创建一个帐户:
def __new__(*cls, **kw):
if len(kw) and "name" in kw:
x = session.query(cls.__class__).filter(cls[0].name==kw["name"]).first()
if x: return x
return object.__new__(*cls, **kw)
Run Code Online (Sandbox Code Playgroud)
这对我来说非常合适.但问题是:
我正在使用最新的0.8.x SQLAlchemy版本和Python 2.7.x.
谢谢你的帮助 :)
维基上有这个例子,网址是http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject.
虽然最近我更倾向于使用@classmethod而不是重新定义构造函数,因为显式优于隐式,也更简单:
user.email = Email.as_unique('foo@bar.com')
Run Code Online (Sandbox Code Playgroud)
(我实际上现在要更新维基以更全面地表示这里的使用选项)