Как получить значения из вложенных классов pydantic?

#python #fastapi #pydantic

Вопрос:

 class mail(BaseModel):
    mailid: int
    email: str
    
class User(BaseModel):
    id: int
    name: str
    mails: List[mail]

data = {
    'id': 123,
    'name': 'Jane Doe',
    'mails':[
        {'mailid':1,'email':'aeajhs@gmail.com'}, 
        {'mailid':2,'email':'aeajhsds@gmail.com'}
    ]
}
    
userobj = User(**data)
 

Как получить значение email в mail классе или mailid из mail класса?

Когда я пытаюсь использовать print(mail.email) его, он выдает ошибку как

 AttributeError: type object 'mail' has no attribute 'email'
 

Когда я использую это, тоже возникает ошибка

 print(userobj.mails.email)
 
 AttributeError: 'list' object has no attribute 'email'
 

Когда я использую это, я получаю следующие данные

 print(userobj.mails)
[mail(mailid=1, email='aeajhs@gmail.com'), mail(mailid=2, email='aeajhsds@gmail.com')]
 

Вывод моего желания должен быть, когда я хочу распечатать электронное письмо, которое я должен получить 'aeajhs@gmail.com','aeajhsds@gmail.com'

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

1. могу ли я получать письма под диктовку

Ответ №1:

Похоже, что вы пытаетесь получить доступ к классу, а не к экземпляру.

Вот один из способов сделать это:

 from pydantic import BaseModel
from typing import List

class Mail(BaseModel):
    mailid: int
    email: str

one_mail = {"mailid": 1, "email": "aeajhs@gmail.com"}

mail = Mail(**one_mail)

print(mail)
# mailid=1 email='aeajhs@gmail.com'
 

С учетом этого давайте адаптируем User модель:

 class User(BaseModel):
    id: int
    name: str
    mails: List[Mail]

data = {
    "id": 123, 
    "name": "Jane Doe",
    "mails":[
        {"mailid": 1, "email": "aeajhs@gmail.com"}, 
        {"mailid": 2, "email": "aeajhsds@gmail.com"}
    ]
}

userobj = User(**data)

print(userobj.mails)
# [Mail(mailid=1, email='aeajhs@gmail.com'), Mail(mailid=2, email='aeajhsds@gmail.com')]
 

Если вам нужен только один из адресов электронной почты, вам нужно указать, какой из них, например:

 print(userobj.mails[0].email)
# aeajhs@gmail.com
 

Чтобы получить список всех адресов электронной почты, вам нужно повторить mails , например:

 print([mail.email for mail in userobj.mails])
# ['aeajhs@gmail.com', 'aeajhsds@gmail.com']
 

Примечание: Pydantic поддерживает проверку строк электронной почты.

Ответ №2:

Ошибка

 AttributeError: 'list' object has no attribute 'email'
 

означает, что вы обращаетесь к атрибуту mails списка, а не mail к объекту.

Сначала вы должны выбрать объект из списка, используя индекс:

 print(userobj.mails[0].email)
 

И, если вам нужно каждое электронное письмо каждого mails экземпляра, сделайте это

 print([mail.email for mail in userobj.mails])