尝试对peewee使用自定义UUID混合不会覆盖基本的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)

wallet.py:

from models import BaseModel,UUIDMixin


class Wallet(UUIDMixin,BaseModel):
    pass

我尝试将Wallet类的继承顺序翻转为BaseModel,UUIDMixin错误消失了,但是它导致了钱包表的字段:{'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

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