From a7a15d4aa53c1567fcee08219f4086260b816176 Mon Sep 17 00:00:00 2001 From: Vova Abdrakhmanov <369565@gmail.com> Date: Tue, 20 Oct 2020 18:33:22 +0400 Subject: [PATCH 1/3] Add Serializer class --- joey/serializers.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 joey/serializers.py diff --git a/joey/serializers.py b/joey/serializers.py new file mode 100644 index 0000000..ae897c0 --- /dev/null +++ b/joey/serializers.py @@ -0,0 +1,23 @@ +from pydantic import BaseModel, Field +from pydantic.main import ModelMetaclass +from pydantic.utils import GetterDict +from typing import List, Optional, Any + + +class NestedGetterDict(GetterDict): + def get(self, key: Any, default: Any = None): + res = self._obj + for s in key.split('.'): + res = getattr(res, s, default) + return res + + +class SerializerMetaclass(ModelMetaclass): + def __call__(cls, obj): + return cls.from_orm(obj) + + +class Serializer(BaseModel, metaclass=ModelMetaclass): + class Config: + orm_mode = True + getter_dict = NestedGetterDict From e34ca0706ede2dc7f3cca27a2a767b113bfa2c50 Mon Sep 17 00:00:00 2001 From: Vova Abdrakhmanov <369565@gmail.com> Date: Wed, 21 Oct 2020 14:26:43 +0000 Subject: [PATCH 2/3] Improve metaclass __call__ method --- joey/serializers.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/joey/serializers.py b/joey/serializers.py index ae897c0..1d86ac5 100644 --- a/joey/serializers.py +++ b/joey/serializers.py @@ -13,7 +13,11 @@ def get(self, key: Any, default: Any = None): class SerializerMetaclass(ModelMetaclass): - def __call__(cls, obj): + def __call__(cls, obj=None, **kwargs): + if obj is None: + return super(SerializerMetaclass, cls).__call__(**kwargs) + if isinstance(obj, dict): + return cls.parse_obj(obj) return cls.from_orm(obj) From 8f978ee32fe90e6e0d53df327f1836f566b3737b Mon Sep 17 00:00:00 2001 From: Vova Abdrakhmanov <369565@gmail.com> Date: Wed, 21 Oct 2020 14:30:41 +0000 Subject: [PATCH 3/3] Add ModelSerializer prototype --- joey/serializers.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/joey/serializers.py b/joey/serializers.py index 1d86ac5..be51b34 100644 --- a/joey/serializers.py +++ b/joey/serializers.py @@ -25,3 +25,8 @@ class Serializer(BaseModel, metaclass=ModelMetaclass): class Config: orm_mode = True getter_dict = NestedGetterDict + +class ModelSerializer(Serializer): + + def create(self): + self.Meta.model.objects.create(**self.dict())