【问题标题】:How to get values from nested pydantic classes?如何从嵌套的 pydantic 类中获取值?
【发布时间】:2021-10-28 11:54:42
【问题描述】:
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)

如何在mail类或mailidmail类中获取email的值?

当我尝试使用 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'

【问题讨论】:

  • 我能以字典形式接收邮件

标签: python fastapi pydantic


【解决方案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 支持email string validation

【讨论】:

    【解决方案2】:

    错误

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

    表示您正在访问mails 列表的属性,而不是mail 对象。

    您应该首先使用索引从列表中选择对象:

    print(userobj.mails[0].email)
    

    而且,如果您想要每个 mails 实例的每封电子邮件,请这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多