Как расширить SerializerMetaclass из DRF и применить его к моему сериализатору? - PullRequest
0 голосов
/ 12 сентября 2018

Использование Python 3.6

В Django Rest framework:

@six.add_metaclass(SerializerMetaclass)
class Serializer(BaseSerializer):
...
class ModelSerializer(Serializer):

Я хочу расширить SerializerMetaclass:

class JSONDataMetaclass(SerializerMetaclass):
    """Meta class to dynamically add SerializerMethodField and look up JSON data"""
    def __new__(cls, name, bases, attrs):

        for field in getattr(attrs.get('Meta'), 'json_fields', []):
            def closure(field):
                def _(self, obj):
                    if len(field) == 1:
                        return obj.raw_data.get(field[0])
                    return obj.raw_data.get(field[1])
                return _

            attrs[field[0]] = serializers.SerializerMethodField()
            attrs['get_{}'.format(field[0])] = closure(field)
        return super(JSONDataMetaclass, cls).__new__(cls, name, bases, attrs)

, чтобы мой сериализатор мог использоватьмой метакласс

В моем сериализаторе клиента:

@six.add_metaclass(JSONDataMetaclass)
class MySerializer(ModelSerializer):
    ...

Но это вызвало некоторые странные поведения, например.он не соответствует определенным depth и сериализуется вплоть до вложенных отношений.Что я делаю не так?

...