首页 > 解决方案 > 有没有办法通过 mixin 设置 peewee 字段?

问题描述

我正在尝试设置一组可重用的数据模型,我可以将其包含在多个应用程序中,如下所示(我在这里使用用户作为示例,但实际的是Authlib库的 peewee 后端):

# mixins.py

class UserMixin(peewee.Model):
    username = peewee.CharField()
    password = peewee.CharField()

    def set_password(self):
        # do stuff
    ...

一旦创建了 mixin,我应该能够像这样导入它,只定义附加字段(默认值已经从 mixin 中获得)

# models.py

db = peewee.SqliteDatabase(config.get('DATABASE_FILE'))

class BaseModel(peewee.model):
    class Meta:
        database = db

class User(BaseModel, UserMixin):
    email = peewee.CharField()
    ...

我见过人们用SQLAlchemy, 但是当我用 peewee 使用这个策略时,它似乎没有正确保存字段:

我的问题:是否有一种“官方方式”来创建可重用的模型 mixinpeewee 中的字段?

我见过其他项目(例如flask-login)使用 mixins,但这些通常set_password是本示例中的附加功能,而不是定义字段本身的功能。


我有一些潜在的替代解决方案,比如

但是可能有一些更清洁的方法可以做到这一点?

标签: pythonooppeeweeflask-peewee

解决方案


这是一个简单的例子:

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 的顺序。


推荐阅读