我正在尝试建立一组可重用的数据模型,我可以将其包含在多个应用程序中,就像这样(我在这里以用户为例,但实际的是{{ 1}}库):
Authlib
一旦创建了mixin,我应该能够像这样导入它,仅定义其他字段(mixin中已经存在默认字段)
# mixins.py
class UserMixin(peewee.Model):
username = peewee.CharField()
password = peewee.CharField()
def set_password(self):
# do stuff
...
我见过人们使用# models.py
db = peewee.SqliteDatabase(config.get('DATABASE_FILE'))
class BaseModel(peewee.model):
class Meta:
database = db
class User(BaseModel, UserMixin):
email = peewee.CharField()
...
来做到这一点,但是当我将这种策略与peewee结合使用时,似乎无法正确保存字段:
SQLAlchemy
继承自UserMixin
,则表示“无法解析导入层次结构”(可能是因为我们多次从peewee.Model
进行导入)peewee.Model
只是UserMixin
,则peewee似乎无法正确处理其字段:它们最终都以未绑定实例的形式存在,并且不会保存在数据库中。我的问题:有没有一种“官方方式”在peewee中创建具有字段的可重用模型混合 ?
我已经看到其他项目(例如object
)使用mixin,但是在此示例中,它们通常是附加功能,例如flask-login
,而不是用于定义字段本身的功能。
我有一些潜在的替代解决方案,例如
set_password
条目分别覆盖其.Meta.database
models.py
models.py
复制。但是可能有更清洁的方法吗?
答案 0 :(得分:0)
这是一个简单的例子:
from peewee import *
db = SqliteDatabase(':memory:')
class Base(Model):
class Meta:
database = db
class UserModelMixin(Model):
username = TextField()
class User(UserModelMixin, Base):
pass
print(User._meta.fields)
#{'id': <AutoField: User.id>, 'username': <TextField: User.username>}
我认为问题在于您的mixin的顺序。