2017-02-20 7 views
0

Ich versuche, einen nicht modellierten eingebetteten Serializer in Django Rest Framework zu erstellen. Ich stecke hier fest. Brauchen Sie Hilfe? Danke im Voraus.Eingebettete Serialisierer in DRF für Mongo und 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) 

Ich verwende DRF Serializer API-Daten zu authentifizieren, aber es in mongoDB speichern. Daher kann ich Model Serializer nicht verwenden. Also wollte ich wissen, ob es eine Möglichkeit gibt, verschachtelte Serialisierer zu schreiben, ohne die Model-Serialisierer zu verwenden. Verschachtelte Serializer erwähnt here

Meine Probeneingangsdaten in diesem Format

{ 
    "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"] 
} 

Auf dieser Dateneingabe sein wird, möchte ich die IP-Daten auch in den Serialisierer validieren und dann die Funktion speichern rufen.

Ich möchte etwas ähnliches wie eingebettete Dokument mongoengine

+1

Es tut mir leid, dass Sie stecken geblieben sind, aber ich habe keine Ahnung, welche Hilfe Sie suchen. Vielleicht zuerst erklären, was nicht funktioniert. – Linovia

Antwort

0

Die größte Ausgabe hier ist, dass Sie IPNetwork(many=True) und setzen IPNetwork als ListSerializer haben.

Man sollte wissen, dass dies redondant ist so viele = True erstellt eine ListSerializer hinter der Szene. Beachten Sie außerdem, dass ListSerializer mit einem Child-Serializer arbeiten soll, der sich von Ihrer Implementierung unterscheidet.

Daher sollten Sie einfach IPNetwork erben von serializers.Serializer und Sie sollten gut gehen.

Nicht-Modell-Serialisierer funktionieren - meistens - das Gleiche wie ModelSerializers, außer dass sie Python-Wörterbücher zurückgeben, sofern die Erstellung/Aktualisierung nicht überschrieben wird. Beachten Sie, dass diese beiden Methoden in Ihrem Fall mit geschachtelten Serialisierern ohnehin überschrieben werden sollten.

+0

Danke. Von Serializers.Serializer geerbt. Aber die create/update Funktionen wurden nicht implementiert. Verwenden des Serialisierers nur für die Datenvalidierung. –

0

Ok. So habe ich es gemacht und es funktioniert super.

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 

Lassen Sie mich wissen, wenn irgendwelche Probleme mit diesem Code oder jemand irgendwelche Fragen hat.

Verwandte Themen