Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

366
Visualizações
How do add an assembled field to a Pydantic model

Say I have model

class UserDB(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None

How do I make another model that is constructed from this one and has a field that changes based on the fields in this model?

For instance, something like this

class User(BaseModel):
    full_name: str = first_name + ' ' + last_name

Constructed like this maybe

User.parse_obj(UserDB)

Thanks!

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

If you do not want to keep first_name and last_name in User then you can

  • customize __init__.
  • use validator for setting full_name.

Both methods do what you want:

from typing import Optional
from pydantic import BaseModel, validator


class UserDB(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None


class User_1(BaseModel):
    location: str  # for a change
    full_name: Optional[str] = None

    def __init__(self, user_db: UserDB, **data):
        super().__init__(full_name=f"{user_db.first_name} {user_db.last_name}", **data)


user_db = UserDB(first_name="John", last_name="Stark")
user = User_1(user_db, location="Mars")
print(user)


class User_2(BaseModel):
    first_name: Optional[str] = None
    last_name: Optional[str] = None
    full_name: Optional[str] = None

    @validator('full_name', always=True)
    def ab(cls, v, values) -> str:
        return f"{values['first_name']} {values['last_name']}"


user = User_2(**user_db.dict())
print(user)

output

location='Mars' full_name='John Stark'
first_name='John' last_name='Stark' full_name='John Stark'

UPDATE: For working with response_model you can customize __init__ in such way:

class User_1(BaseModel):
    location: str  # for a change
    full_name: Optional[str] = None

    # def __init__(self, user_db: UserDB, **data):
    def __init__(self, first_name, last_name, **data):
        super().__init__(full_name=f"{first_name} {last_name}", **data)


user_db = UserDB(first_name="John", last_name="Stark")
user = User_1(**user_db.dict(), location="Mars")
print(user)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda