有没有办法通过mixin设置peewee字段?

时间:2019-10-21 09:33:53

标签: python oop peewee flask-peewee

我正在尝试建立一组可重用的数据模型,我可以将其包含在多个应用程序中,就像这样(我在这里以用户为例,但实际的是{{ 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
  • 仅定义mixin中的其他功能;每次在models.py
  • 中分别定义字段
  • 使用共享代码作为文件来复制粘贴,而不是直接models.py复制。

但是可能有更清洁的方法吗?

1 个答案:

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