python - 尝试为 peewee 使用自定义 UUID mixin 不会覆盖基本 AutoField ID
问题描述
我想创建一个仅包含 UUIDField 的字段 mixin,作为包含该 mixin 的任何模型的主键,用于某些模型,但不是全部(某些模型的主键由外部程序定义)。我希望我的大多数模型不使用 AutoField 作为主键。具体来说,我正在设计一个简单的货币系统,并且我有一个 Wallet 模型,它将继承自 peewee 建议您创建用于初始化数据库的 BaseModel 类,以及这个 UUID mixin。我的问题是,当我尝试时database.create_tables([Wallet])
,我收到以下错误:
peewee.ImproperlyConfigured: database attribute does not appear to be set on the model: <Model: Wallet>
我的文件夹结构如下(我将省略__init__.py
文件):
models
|_ base_model.py
|_ currencies
|_ wallet.py
|_ mixins
|_ uuid_mixin.py
base_model.py:
db = SqliteDatabase('database.db',
pragmas={
'foreign_keys': 1,
'journal_mode': 'wal',
})
class BaseModel(Model):
class Meta:
database = db
uuid_mixin.py:
import uuid
from peewee import UUIDField, Model
class UUIDMixin(Model):
id = UUIDField(primary_key=True, default=uuid.uuid4)
钱包.py:
from models import BaseModel, UUIDMixin
class Wallet(UUIDMixin, BaseModel):
pass
我尝试将 Wallet 类中的继承顺序翻转为BaseModel, UUIDMixin
,错误消失了,但它导致了 wallet 表的字段:{'id': <AutoField: Wallet.id>}
,而不是我期望的 UUID。我的代码有什么问题?
解决方案
为了避免导致这种情况的多重继承问题,我将构建一个单独的基本模型,例如:
class BaseModel(Model):
class Meta:
database = db
class BaseModelWithUUID(BaseModel):
id = UUIDField(primary_key=True, default=uuid.uuid4)
class Wallet(BaseModelWithUUID):
pass
另外,我不知道您的实现细节,但在处理货币时,自定义字段而不是模型可能更有意义。
推荐阅读
- javascript - Firefox 无法读取获取响应标头
- html - Ant Design Cards 没有正确对齐
- python - 如何在 PyQt5 中重置 UI
- android - 如果嵌套滚动视图结束,如何停用滚动父滚动视图?
- javascript - 如何在 React 中使用 POST 方法将对象添加到数据库?
- android - 在项目“应用程序”中,已解决的 Google Play 服务库依赖项依赖于另一个确切版本(例如“[1.3.1 ,2.3]”,
- r - 180 个嵌套条件在一个单独的文件中为我的数据框中的每一行创建一个新的 id 变量
- amazon-web-services - lambda Add-Permissions 上的 Localstack 404
- ios - 使用 trailingSwipeActionsConfigurationForRowAt 删除行时奇怪的缺少其他行问题
- google-cloud-dataflow - Java Apache Beam - 侧面输入问题