2017-02-20 16 views
0

Я пытаюсь создать нестандартный встроенный сериализатор в Django Rest Framework. Я застрял здесь. Вам нужна помощь. Заранее спасибо.Встраиваемые сериализаторы в DRF для mongo и django

class IPNetwork(serializers.ListSerializer): 
    network_netmask = serializers.IPAddressField(required=False) 
    network_gateway = serializers.IPAddressField(required=False) 
    network_mac = serializers.CharField(required=False) 
    network_dns = serializers.ListField(required=False) 
    network_ip = serializers.IPAddressField(required=False) 

class RouterInfoSerializer(serializers.Serializer): 
    router_name = serializers.CharField(required=False) 
    router_ip_networks = IPNetwork(many=True) 
    router_devices = serializers.ListField(required=False) 

Я использую сериализаторы DRF для аутентификации данных API, но храня их в mongoDB. Поэтому я не могу использовать сериализатор модели. Итак, я хотел знать, есть ли способ писать вложенные сериализаторы без использования сериализаторов модели. Вложенные сериализаторов упоминается here

Мои выборочные входные данные будут в этом формате

{ 
    "name": "Test Router", 
    "ip_networks":[ 
    { 
     "ip": "192.168.1.1", 
     "netmask": "255.255.255.0", 
     "gateway": "192.168.1.1", 
     "mac": "EA:8C:0C:1F:BC:DC", 
     "dns": ["8.8.8.8", "8.8.4.4"] 
    } 
    ], 
    "router_devices": ["List of clients connected"] 
} 

На этом ввод данных, я хочу, чтобы проверить данные Ip также в сериализатором, а затем вызвать функцию сохранения.

Я хочу что-то похожее на встроенный документ mongoengine

+1

Прошу прощения за то, что вы застряли, но я понятия не имею, какую помощь вы ищете. Может быть, начинать с объяснения того, что не работает. – Linovia

ответ

0

Самой большой проблемой здесь является то, что у вас есть IPNetwork(many=True) и установить IPNetwork в ListSerializer.

Следует знать, что это redondant, как много = True создает ListSerializer за сценой. Также обратите внимание, что ListSerializer предназначены для работы с дочерним сериализатором, который отличается от вашей реализации.

Поэтому вы должны просто сделать IPNetwork наследовать от serializers.Serializer, и вам должно быть хорошо идти.

Некоммерческие сериализаторы работают - в основном - то же, что и ModelSerializers, за исключением того, что они возвращают словари python, если только изменение/изменение не отменено. Обратите внимание, что в вашем случае с вложенными сериализаторами эти два метода должны быть переопределены в любом случае.

+0

Спасибо. Унаследовано от serializers.Serializer. Но не реализованы функции создания/обновления. Использование сериализатора только для проверки данных. –

0

Хорошо. Так вот как я это сделал, и он отлично работает.

class IPNetwork(serializers.Serializer): 
    network_netmask = serializers.IPAddressField(required=True) 
    network_gateway = serializers.IPAddressField(required=True) 
    network_mac = serializers.CharField(required=True) 
    network_dns = serializers.ListField(required=True) 
    network_ip = serializers.IPAddressField(required=True) 

class RouterInfoSerializer(serializers.Serializer): 
    router_name = serializers.CharField(required=True) 
    router_ip_networks = serializers.ListField(required=True) 
    router_devices = serializers.ListField(required=False) 

    def validate_router_ip_networks(self, value): 
    if not IPNetwork(data=value, many=True).is_valid(): 
     raise serializers.ValidationError("Router IP network data is invalid") 
    return value 

Дайте мне знать, если возникнут какие-либо проблемы с этим кодом или у кого-либо еще есть вопросы.