尝试为peewee使用自定义UUID mixin不会覆盖基本自动字段ID

2024-09-30 03:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个仅包含UUIDField的字段mixin,它是包含mixin的任何模型的主键,用于某些模型,但不是所有模型(某些模型的主键由外部程序定义)。我希望我的大多数型号的主键不使用自动字段。具体来说,我正在设计一个简单的货币系统,我有一个钱包模型,它将继承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)

wallet.py:

from models import BaseModel, UUIDMixin


class Wallet(UUIDMixin, BaseModel):
    pass

我尝试将Wallet类中的继承顺序翻转到BaseModel, UUIDMixin,错误消失了,但它导致Wallet表的字段:{'id': <AutoField: Wallet.id>},而不是我期望的UUID。我的代码怎么了


Tags: py模型dbmodeluuidmixindatabaseclass
1条回答
网友
1楼 · 发布于 2024-09-30 03:22:10

为了避免导致这种情况的多重继承问题,我只需构建一个单独的基础模型,例如:

class BaseModel(Model):

    class Meta:
        database = db


class BaseModelWithUUID(BaseModel):
    id = UUIDField(primary_key=True, default=uuid.uuid4)


class Wallet(BaseModelWithUUID):
    pass

另外,我不知道您的实现的细节,但在处理货币时,自定义字段而不是模型可能更有意义

相关问题 更多 >

    热门问题