#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])