Рейтинг  

Яндекс.Метрика
Яндекс цитирования
 

   

Статистика  

Пользователи
7
Материалы
592
Кол-во просмотров материалов
2825189
   

Использование pydantic для чтения json-данных + универсальная сортировка по имени поля

from copy import deepcopy
from typing import Any, List, Optional

from pydantic import BaseModel, RootModel


class PosaModel(BaseModel):
    id: int = None
    count: float = None
    amount: float = None


class CostModel(BaseModel):
    id: Optional[int] = None
    name: str = None
    number: str = None
    ext: str = None
    type: str = None
    posa: Optional[List[PosaModel]] = None

    @property
    def fields(self):
        return vars(self).keys()

    @property
    def full_name(self) -> str:
        return f"{self.name} - {self.number}"

    def __str__(self):
        return self.full_name

    def __repr__(self):
        return self.__str__()


class CostsList(RootModel):
    root: List[CostModel] = None

    def get_sorted_list_by(
            self, field_name: Any, reverse: bool = False
            ) -> List[CostModel]:
        """
        возможные имена для field_name: id, name, number, ext, type
        """
        costs = deepcopy(self.root)
        fields_list = [getattr(account, field_name) for account in costs]
        fields_list.sort(reverse=reverse)
        costs_sorted = []
        for field in fields_list:
            cost = next(filter(
                lambda a: getattr(a, field_name) == field, costs
                ))
            costs_sorted.append(cost)
            del cost
        return costs_sorted


list_dict = [
    {"id": 1, "name": "Name 1", "number": "№ 1", "ext": "ext 1", "type": "costa",
     "posa":
         [{"id": 11, "count": 1.11, "amount": 11.11},
          {"id": 12, "count": 1.12, "amount": 12.12}]
     },
    {"id": 3, "name": "Name 3", "number": "№ 3", "ext": "ext 3", "type": "costa",
     "posa":
         [{"id": 31, "count": 3.11, "amount": 31.11},
          {"id": 32, "count": 3.12, "amount": 32.12}]
     },
    {"id": 2, "name": "Name 22", "number": "№ 22", "ext": "ext 2", "type": "costa",
     "posa":
         [{"id": 21, "count": 2.11, "amount": 21.11},
          {"id": 22, "count": 2.12, "amount": 22.12}]
     }
    ]


if __name__ == '__main__':
    di = list_dict[1]
    costs = CostsList().model_validate(list_dict)
    print(costs.root)
    costs_sort = costs.get_sorted_list_by("name")
    print(costs_sort)

   
   

Login Form