Проанализировать файл JSON в модели PydanticPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проанализировать файл JSON в модели Pydantic

Сообщение Anonymous »

Я создал модель Pydantic.
Но она не конвертирует и выдает ошибку.
Скажите, пожалуйста, в чем дело.

Код: Выделить всё

classDTO
:

Код: Выделить всё

from pydantic import BaseModel,Field
from typing import List,Dict
from datetime import date

class OurBaseModel(BaseModel):
pass
#class Config:
#orm_mode = True

class SessionSubjectDTO(OurBaseModel):
edu_year: int
semester_type: str

class MarkDTO(OurBaseModel):
semester_number: int
subject_name: str
control_type: str
mark: str  # or int
session_subject: SessionSubjectDTO #= Field(None, alias="SessionSubjectDTO")

class MarksDTO(OurBaseModel):
__root__: List[MarkDTO]

class AttestationDTO(BaseModel):
subject_name: str
value: int
attestation_start_date: date

class AttestationsDTO(OurBaseModel):
__root__: List[AttestationDTO]

class DebtDTO(OurBaseModel):
semester_number: int
subject_name: str
control_type: str
session_subject: SessionSubjectDTO #= Field(None, alias="SessionSubjectDTO")

class DebtsDTO(OurBaseModel):
__root__: List[DebtDTO]

class SkipDTO(OurBaseModel):
valid: int
no_valid: int
attestation_start_date: date

class SkipsDTO(OurBaseModel):
__root__: List[SkipDTO]

class StudentDTO(OurBaseModel):
uid: str
marks: MarksDTO
attestations: AttestationsDTO
debts: DebtsDTO
skips: SkipsDTO

class StudentsDTO(OurBaseModel):
__root__: List[StudentDTO]

Код: Выделить всё

example.json
:

Код: Выделить всё

[
{
"uid": "61c689ac-98a1-11e9-8198-4ccc6a2d123b",
"marks": [
{
"semester_number": 1,
"subject_name": "454",
"control_type": "5",
"mark": "3.",
"date": "2019-12-27",
"session_subject": {
"id": 4228,
"edu_year": 2019,
"semester_type": "1"
}
}
],
"attestations": [
{
"subject_name": "133",
"value": 2,
"attestation_start_date": "2019-10-07",
"attestation_end_date": "2019-10-12"
}
],
"debts": [
{
"semester_number": 4,
"subject_name": "323",
"control_type": "12",
"session_subject": {
"id": 22856,
"edu_year": 2020,
"semester_type": "20"
}
}
],
"skips": [
{
"valid": null,
"no_valid": null,
"attestation_start_date": "2020-03-09",
"attestation_end_date": "2020-03-14"
}
]
}
]
:

Код: Выделить всё

students = pydantic.parse_file_as(path='192.json', type_=classDTO.StudentsDTO)
Ошибки:

Код: Выделить всё

Traceback (most recent call last):
File "main.py", line 73, in 
students  = pydantic.parse_file_as(path='192.json', type_=classDTO.StudentsDTO)
File "pydantic\tools.py", line 60, in pydantic.tools.parse_file_as
File "pydantic\tools.py", line 38, in pydantic.tools.parse_obj_as
File "pydantic\main.py", line 331, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 424 validation errors for ParsingModel[StudentsDTO]
__root__ -> __root__ -> 0 -> attestations -> __root__ -> 18 -> value
none is not an allowed value (type=type_error.none.not_allowed)
__root__ -> __root__ -> 0 -> attestations -> __root__ -> 19 ->  value
none is not an allowed value (type=type_error.none.not_allowed)
__root__ -> __root__ -> 0 -> attestations -> __root__ -> 20 -> value
none is not an allowed value (type=type_error.none.not_allowed)
...
__root__ -> __root__ -> 16 -> skips -> __root__ -> 1 -> no_valid
none is not an allowed value (type=type_error.none.not_allowed)
Я пытался решить проблему с помощью пользовательских корневых типов:

Модели Pydantic можно определить с помощью пользовательского корневого типа объявив поле. __root__
Корневой тип может быть любым типом, поддерживаемым pydantic, и указывается подсказкой типа в поле __root__. Корневое значение можно передать в модель __init__ через аргумент ключевого слова __root__ или в качестве первого и единственного аргумента parse_obj.


Подробнее здесь: https://stackoverflow.com/questions/717 ... ntic-model
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как проанализировать ObjectId в модели Pydantic?
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как десериализовать вложенные модели Pydantic из JSON, где вложенные модели хранятся в списке в вычисляемом поле.
    Anonymous » » в форуме Python
    0 Ответы
    115 Просмотры
    Последнее сообщение Anonymous
  • Используйте Pydantic Settings CLI, чтобы проанализировать частичный json из файла
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как проанализировать и сохранить большую модель Pydantic в sqlalchemy
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Получение sphinx autodoc для удобного набора текста. Annotated, Pydantic и autodoc-pydantic.
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»