#python #serialization #orm #pydantic #tortoise-orm
Вопрос:
Предполагая следующие модели Tortoise-ORM :
class Recipe(Model):
...
ingredients = fields.ManyToManyField(model_name="models.Ingredient", related_name="recipes", null=True,
on_delete=fields.SET_NULL,
description="List of required ingredients")
class Ingredient(Model):
name: fields.CharField()
not_needed: fields.CharField()
Чего я хочу достичь:
Я хочу создать PydanticModel для рецепта, который не будет содержать Ingredient.not_needed
поля, вот так:
pydantic_model_creator(Recipe, exclude=("ingredients.not_needed"))
Одна вещь, которая приходит мне на ум, — это использовать вычисляемое свойство, но мне интересно, есть ли какие-либо другие более удобные подходы к этой проблеме?
Что я пробовал:
Я попытался создать пользовательский класс модели Pydantic:
class IngredientInRecipeDTO(BaseModel):
name: str
class Config:
orm_mode = True
class RecipeDTO(BaseModel):
...
ingredients: list[IngredientInRecipeDTO]
class Config:
orm_mode = True
Но это приводит к некоторой ошибке при сериализации ингредиентов: «значение ингредиентов не является допустимым списком«.
Я думаю, проблема в том, что во время сериализации pydantic ожидает список, ссылаясь на поле «ингредиенты» в объекте рецепта. Фактически это поле является объектом M2MRelation, в котором есть поле «related_objects», внутри которого находится фактический (желаемый) список.