-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexample.py
111 lines (68 loc) · 2.5 KB
/
example.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# some simple models
class Model(object):
def __init__(self, name) -> None:
super().__init__()
self.name = name
def __str__(self):
return self.name
class Building(Model):
def __init__(self, name, address) -> None:
super().__init__(name)
self.address = address
class Ship(Model):
travels_on = 'water'
class Car(Model):
travels_on = 'land'
# Serializers are responsible for serializing some model class:
class MappedSerializerClass(type):
serializer_class_map = {}
class Meta:
model_class = None
def __init__(cls, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
model_class = cls.Meta.model_class
if model_class:
MappedSerializerClass.serializer_class_map[model_class] = cls
def get_serializer_class(model):
return MappedSerializerClass.serializer_class_map[type(model)]
class Serializer(object, metaclass=MappedSerializerClass):
def __init__(self, model=None) -> None:
super().__init__()
self.model = model
# noinspection PyUnusedLocal
def create(self, serialized_data):
self.model = self.Meta.model_class()
def serialize(self):
return {}
class ModelSerializer(Serializer):
class Meta:
model_class = Model
def serialize(self):
return {**super().serialize(), 'name': self.model.name}
class VehicleSerializer(ModelSerializer):
class Meta:
model_class = None
def serialize(self):
return {**super().serialize(), 'travels_on': self.model.travels_on}
class ShipSerializer(VehicleSerializer):
class Meta:
model_class = Ship
class CarSerializer(VehicleSerializer):
class Meta:
model_class = Car
class BuildingSerializer(ModelSerializer):
class Meta:
model_class = Building
def serialize(self):
return {**super().serialize(), 'address': self.model.address}
# Test it
serialized_models_in = {'vanilla1': {'class': Model},
'building1': {'class': Building,
'address': 'adventure.minus.sea'},
'ship1': {'class': Ship},
'car1': {'class': Car}}
def make_model(name, spec):
model_class = spec.pop('class')
return model_class(name, **spec)
models = {name: make_model(name, spec) for name, spec in serialized_models_in.items()}
serialized_models_out = {name: get_serializer_class(model)(model).serialize() for name, model in models.items()}