Pydantic: Как проанализировать JSON с помощью пользовательского имени свойства

#python #pydantic

Вопрос:

Как я могу определить сопоставление свойства json с моделью pydantic, в которой имя свойства отличается?. ie:

 # I want to parse thumbnailUrl into thumbnail
class ChatMessageAttachment(BaseModel):
    id: str
    thumbnail: Optional["str"] = None

external_data = {"id": "123", "thumbnailUrl": "www.google.es"}
chat_message = ChatMessageAttachment(**external_data)
print(chat_message) # >>>id='123' thumbnail=None
 

Комментарии:

1. почему бы заранее не заменить ключ thumbnailUrl на thumbnail в диктанте данных?

2. Это действительно было моим первым решением

Ответ №1:

В Pydantic для этого можно использовать псевдонимы. В приведенном ниже коде вам понадобится только Config allow_population_by_field_name то, если вы также хотите создать экземпляр объекта с оригиналом thumbnail . Если вы используете его только thumbnailUrl при создании объекта, он вам не нужен:

 from pydantic import BaseModel, Field
from typing import Optional

class ChatMessageAttachment(BaseModel):
    id: str
    thumbnail: Optional["str"] = Field(None, alias="thumbnailUrl")
    class Config:
        allow_population_by_field_name = True


external_data = {"id": "123", "thumbnailUrl": "www.google.es"}
chat_message = ChatMessageAttachment(**external_data)

print(chat_message) 
#  id='123' thumbnail='www.google.es
 

С allow_population_by_field_name вами также можно обойтись:

 external_data = {"id": "123", "thumbnail": "www.google.es"}
ChatMessageAttachment(**external_data)
# ChatMessageAttachment(id='123', thumbnail='www.google.es')
 

Комментарии:

1. Спасибо, это именно то, что я искал

2. Мило! Я не знал об alias использовании в pydantic. Мне это нравится, чисто и просто.