tortoise-orm下pydantic_model_creator 外鍵字段丟失

tortoise-orm 生成Pydantic,丟失外鍵字段

目錄結構大致如下

models.py

class Project(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255, description="項目名稱", unique=True)
    desc = fields.TextField(description="項目描述", null=True)
    created_at = fields.DatetimeField(auto_now_add=True)
    modified_at = fields.DatetimeField(auto_now=True)
    
class Env(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255, description="環境名稱")
    base_url = fields.CharField(255, description="基準地址")
    base_header = fields.TextField(description="基準請求頭", null=True)
    db_type = fields.CharField(255, description="數據庫類型", null=True)
    db_host = fields.CharField(255, description="數據庫地址", null=True)
    db_port = fields.CharField(255, description="數據庫端口", null=True)
    db_name = fields.CharField(255, description="數據庫名稱", null=True)
    db_charset = fields.CharField(255, description="數據庫編碼", null=True)
    db_user = fields.CharField(255, description="數據庫用戶", null=True)
    db_passwd = fields.CharField(255, description="數據庫密碼", null=True)
    # 外鍵關聯project表,可通過.envs訪問到項目所有表 https://tortoise-orm.readthedocs.io/en/latest/models.html
    project = fields.ForeignKeyField('models.Project', related_name='envs')
    

# 生成pydantic 模型
Project_Pydantic = pydantic_model_creator(Project, name="Project")
ProjectIn_Pydantic = pydantic_model_creator(Project, name="ProjectIn", exclude_readonly=True)


Env_Pydantic = pydantic_model_creator(Env, name="Env")
EnvIn_Pydantic = pydantic_model_creator(Env, name="EvnIn", exclude_readonly=True)

routers.py

#!/usr/bin/env/ python3
# -*- coding:utf-8 -*-
"""
@Project: apiAutoTestFastAPI
@File  :env.py
@Author:zy7y
@Date  :2021/4/19 21:18
@Desc  :
"""

from fastapi import APIRouter

from db import models

envs = APIRouter(tags=["環境相關"])


@envs.post("/env")
async def create(env: models.EnvIn_Pydantic):
    return await models.Env.all()

swaager

解決

tip: 在生成Pydantic模型前 使用 Tortoise.init_models(["db.models"], "models")

其中 db.models爲模塊路徑

models.py

"""
project: apiAutoTestWeb
file: models.py
author: zy7y
date: 2021/4/17
"""
from tortoise import fields, Tortoise
from tortoise.contrib.pydantic import pydantic_model_creator
from tortoise.models import Model



class Project(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255, description="項目名稱", unique=True)
    desc = fields.TextField(description="項目描述", null=True)
    created_at = fields.DatetimeField(auto_now_add=True)
    modified_at = fields.DatetimeField(auto_now=True)


class Env(Model):
    id = fields.IntField(pk=True)
    name = fields.CharField(max_length=255, description="環境名稱")
    base_url = fields.CharField(255, description="基準地址")
    base_header = fields.TextField(description="基準請求頭", null=True)
    db_type = fields.CharField(255, description="數據庫類型", null=True)
    db_host = fields.CharField(255, description="數據庫地址", null=True)
    db_port = fields.CharField(255, description="數據庫端口", null=True)
    db_name = fields.CharField(255, description="數據庫名稱", null=True)
    db_charset = fields.CharField(255, description="數據庫編碼", null=True)
    db_user = fields.CharField(255, description="數據庫用戶", null=True)
    db_passwd = fields.CharField(255, description="數據庫密碼", null=True)
    # 外鍵關聯project表,可通過.envs訪問到項目所有表 https://tortoise-orm.readthedocs.io/en/latest/models.html
    project = fields.ForeignKeyField('models.Project', related_name='envs')



Tortoise.init_models(["db.models"], "models")



Project_Pydantic = pydantic_model_creator(Project, name="Project")
ProjectIn_Pydantic = pydantic_model_creator(Project, name="ProjectIn", exclude_readonly=True)


Env_Pydantic = pydantic_model_creator(Env, name="Env")
EnvIn_Pydantic = pydantic_model_creator(Env, name="EvnIn", exclude_readonly=True)

參考資料

https://github.com/tortoise/tortoise-orm/issues/543

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章