代码之家  ›  专栏  ›  技术社区  ›  Ullan

为什么在尝试使用pydantic验证JSON数据时,我会得到“使用不正确字段定义的验证器”?

  •  0
  • Ullan  · 技术社区  · 2 年前

    我试图将JSON对象解析到pydantic验证器,但它给出了一个编译器错误。

    pydantic.errors。ConfigError:使用不正确的字段定义的验证器: 验证等级

    {
      "grade": "A"
      "subject": [
        {
          "physics": "PHY",
          "chemistry": "CHE",
          "classTime": {
        "date": "2024-03-25",
        "time": null
          },
          "labTime":null
          }
        }
      ]
    }
    

    实现代码:

    class Grade(BaseModel):
        @validator("grade")
        def validate_grade(cls, val):
            if (val == None):
                raise ValueError("grade is null")     
    
    class subject(BaseModel): 
        @validator("classTime", pre=True, always=True)
        def validate_classTime(cls, value, values):
            date_str = value.get('date', '')
            time_str = value.get('time', '')
    

    上面的实现是在添加部分后抛出错误的:

    class Grade(BaseModel):     
    

    我还想在课堂科目中得到“分数”。在参考了类似的实现后,我尝试了不同的选项,但没有运气。

    1 回复  |  直到 2 年前
        1
  •  0
  •   mkrieger1 djuarezg    2 年前

    没有包含的模型 grade subject 领域。

    from pydantic import BaseModel, validator
    from typing import List, Optional
    from datetime import date, time
    
    
    class ClassTime(BaseModel):
        date: Optional[date]
        time: Optional[time]
    
    
    class Subject(BaseModel):
        physics: str
        chemistry: str
        classTime: Optional[ClassTime]
        labTime: Optional[str]
    
    
    class Student(BaseModel):
        grade: str
        subject: List[Subject]
    
        @validator("grade")
        def validate_grade(cls, val):
            if val is None:
                raise ValueError("grade is null")
            return val
    
        @validator("subject", each_item=True)
        def validate_subject(cls, val):
            if val.classTime:
                if not val.classTime.date:
                    raise ValueError("classTime.date is null")
            return val
    
    
    json_data = {
        "grade": "A",
        "subject": [
            {
                "physics": "PHY",
                "chemistry": "CHE",
                "classTime": {
                    "date": "2024-03-25",
                    "time": None
                },
                "labTime": None
            }
        ]
    }
    
    student = Student(**json_data)
    print(student)
    

    输出

    grade='A' subject=[Subject(physics='PHY', chemistry='CHE', classTime=ClassTime(date=datetime.date(2024, 3, 25), time=None), labTime=None)]