我想以这样的方式使用sqlalchemy:
email1 = EmailModel(email="user@domain.com", account=AccountModel(name="username"))
email2 = EmailModel(email="otheruser@domain.com", account=AccountModel(name="username"))
通常,sqlalchemy会为帐户创建两个条目,并将每个电子邮件地址链接到此。如果我将帐户名设置为唯一的SqLalCyMy,则抛出一个异常,它告诉我一个具有相同值的条目已经存在。这一切都是有道理的,而且工作如期。
现在我自己想出了一种方法,允许使用上述代码,只需重写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)
这对我很有效。但问题是:
这是正确的方法吗?
有没有达到同样效果的方法?
我使用的是最新的0.8.x sqlalchemy版本和python 2.7.x
谢谢你的帮助:)
最佳答案
维基在AA>中正好有这个例子。
虽然最近我更倾向于使用@类方法,而不是重新定义构造函数,因为显式优于隐式,也更简单:
user.email = Email.as_unique('foo@bar.com')
(我实际上要更新wiki,现在更全面地表示这里的用法选项)
关于python - SQLAlchemy:调用构造函数时返回现有对象,而不是创建新的on,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13440905/