尝试为 peewee 使用自定义 UUID mixin 不会覆盖基本的 AutoField ID
Trying to use a custom UUID mixin for peewee does not override base AutoField ID
我想创建一个仅包含 UUIDField 的字段混合,作为包含混合的任何模型的主键,用于某些模型,但不是全部(某些模型的主键由外部程序)。我希望我的大部分模型不使用 AutoField 作为它们的主键。具体来说,我正在设计一个简单的货币系统,并且我有一个钱包模型,它将继承自 peewee 建议您创建的用于初始化数据库的 BaseModel class,以及这个 UUID 混合。我的问题是,当我尝试 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)
wallet.py:
from models import BaseModel, UUIDMixin
class Wallet(UUIDMixin, BaseModel):
pass
我尝试将钱包 class 中的继承顺序翻转为 BaseModel, UUIDMixin
,错误消失了,但它导致钱包 table 的字段:{'id': <AutoField: Wallet.id>}
,不是我期望的 UUID。我的代码有什么问题?
为了避免导致这种情况的 multiple-inheritance 问题,我将构建一个单独的基础模型,例如:
class BaseModel(Model):
class Meta:
database = db
class BaseModelWithUUID(BaseModel):
id = UUIDField(primary_key=True, default=uuid.uuid4)
class Wallet(BaseModelWithUUID):
pass
此外,我不知道您的实施细节,但在处理货币时,自定义字段而不是模型可能更有意义。
我想创建一个仅包含 UUIDField 的字段混合,作为包含混合的任何模型的主键,用于某些模型,但不是全部(某些模型的主键由外部程序)。我希望我的大部分模型不使用 AutoField 作为它们的主键。具体来说,我正在设计一个简单的货币系统,并且我有一个钱包模型,它将继承自 peewee 建议您创建的用于初始化数据库的 BaseModel class,以及这个 UUID 混合。我的问题是,当我尝试 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)
wallet.py:
from models import BaseModel, UUIDMixin
class Wallet(UUIDMixin, BaseModel):
pass
我尝试将钱包 class 中的继承顺序翻转为 BaseModel, UUIDMixin
,错误消失了,但它导致钱包 table 的字段:{'id': <AutoField: Wallet.id>}
,不是我期望的 UUID。我的代码有什么问题?
为了避免导致这种情况的 multiple-inheritance 问题,我将构建一个单独的基础模型,例如:
class BaseModel(Model):
class Meta:
database = db
class BaseModelWithUUID(BaseModel):
id = UUIDField(primary_key=True, default=uuid.uuid4)
class Wallet(BaseModelWithUUID):
pass
此外,我不知道您的实施细节,但在处理货币时,自定义字段而不是模型可能更有意义。