python - 尝试为 peewee 使用自定义 UUID mixin 不会覆盖基本 AutoField ID

标签 python model uuid mixins peewee

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

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

关于python - 尝试为 peewee 使用自定义 UUID mixin 不会覆盖基本 AutoField ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64638198/

相关文章:

python - Alembic 降级似乎不理解元数据

python - django 中的表单验证

python - python中如何移动到下一个文件

python - 无法从 image.load() 写入 Python 数据结构

ruby-on-rails - Ruby on Rails : errors. add_to_base 与 errors.add

iphone - 为 UIWebView 添加模型层(带缓存); UIWebViewNavigationType 和 shouldStartLoadWithRequest 的问题

android - Android 上的 RFC 4122 UUID?

cakephp - 调用$ this-> model-> create()在cakephp中的 Controller 中崩溃

mysql - 如何正确地将 uuid 转换为 BINARY(16)?

ios - 获取跨平台 UUID