Tortoise-orm 使用(二) 元类及Mixin

元类

一个简单示例

from enum import Enum

from tortoise import fields
from tortoise.models import Model


class Gender(Enum):
    MALE = "male"
    FEMALE = "female"


class UserModel(Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=50, description="用户名")
    nickName = fields.CharField(max_length=50, description="昵称")
    gender = fields.CharEnumField(Gender, default=None, description="性别")
    avatar = fields.CharField(max_length=256, null=True, description="头像")
    address = fields.CharField(max_length=256, null=True, description="地址")
    email = fields.CharField(max_length=256, null=True, description="邮箱")
    password = fields.CharField(max_length=50, description="密码")
    createTime = fields.DatetimeField(auto_now_add=True, description="创建事件")
    updateTime = fields.DatetimeField(auto_now=True, description="更新时间")
    enable = fields.BooleanField(default=False, description="是否启用")

    class Meta:
        table = "user"

此段代码需要说明的是

createTime - auto_now_add 只在第一次保存时候添加

updateTime - auto_now 每次保存都会更新

    class Meta:
        table = "user" # 指定表名称,元类应用一

抽象公共部分

from enum import Enum

from tortoise import fields
from tortoise.models import Model


class Gender(Enum):
    MALE = "male"
    FEMALE = "female"


class BaseModel(Model):
    id = fields.IntField(pk=True)

    class Meta:
        abstract = True


class UserModel(BaseModel):
    username = fields.CharField(max_length=50, description="用户名")
    nickName = fields.CharField(max_length=50, description="昵称")
    gender = fields.CharEnumField(Gender, default=None, description="性别")
    avatar = fields.CharField(max_length=256, null=True, description="头像")
    address = fields.CharField(max_length=256, null=True, description="地址")
    email = fields.CharField(max_length=256, null=True, description="邮箱")
    password = fields.CharField(max_length=50, description="密码")
    createTime = fields.DatetimeField(auto_now_add=True, null=True, description="创建事件")
    updateTime = fields.DatetimeField(auto_now=True, null=True, description="更新时间")
    enable = fields.BooleanField(default=False, description="是否启用")

    class Meta:
        table = "user"

代码说明

# 抽象出来id这个公共的部分,元类定义为抽象就不生成实际的表

class BaseModel(Model):
    id = fields.IntField(pk=True)

    class Meta:
        abstract = True # 定义抽象模型,元类应用二

# 在下面的类定义中直接继承BaseModel即可

class UserModel(BaseModel):
        ...

Mixin更进一步抽象

mixin介绍

Mixin 是一种多重继承的设计模式,它允许将多个类的功能组合在一起,以便在不创建新类的情况下扩展现有类的功能。
在 Python 中,Mixin 通常是定义在一个单独的模块中,并通过 import 语句将其导入到其他模块中使用。Mixin 类通常包含一些方法和属性,这些方法和属性可以被其他类继承和重用。

本地案例

from enum import Enum

from tortoise import fields
from tortoise.models import Model


class Gender(Enum):
    MALE = "male"
    FEMALE = "female"


class NameMixin:
    username = fields.CharField(50, unique=True, description="用户名")


class DateTimeMixin:
    createTime = fields.DatetimeField(auto_now_add=True, null=True, description="创建事件")
    updateTime = fields.DatetimeField(auto_now=True, null=True, description="更新时间")


class BaseModel(Model):
    id = fields.IntField(pk=True)

    class Meta:
        abstract = True


class UserModel(BaseModel, NameMixin, DateTimeMixin):
    nickName = fields.CharField(max_length=50, description="昵称")
    gender = fields.CharEnumField(Gender, default=None, description="性别")
    avatar = fields.CharField(max_length=256, null=True, description="头像")
    address = fields.CharField(max_length=256, null=True, description="地址")
    email = fields.CharField(max_length=256, null=True, description="邮箱")
    password = fields.CharField(max_length=50, description="密码")
    enable = fields.BooleanField(default=False, description="是否启用")

    class Meta:
        table = "user"


class RoleModel(BaseModel, NameMixin):
    code = fields.CharField(max_length=40, description="角色字符串")
    enable = fields.BooleanField(default=False, description="是否启用")

    class Meta:
        table = "roles"

执行命令后,生成的数据表结构

结束

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值