Исключите поля вложенных объектов из отношения m2m при создании модели pydantic с помощью pydantic_model_creator?

#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», внутри которого находится фактический (желаемый) список.