用于mongo和django的DRF中的嵌入序列化器

问题描述:

我想在Django Rest Framework中创建一个非模型嵌入序列化器。我被困在这里。需要你的帮助。提前致谢。用于mongo和django的DRF中的嵌入序列化器

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中。所以我不能使用Model Serializer。 所以我想知道是否有任何方法可以在不使用Model序列化器的情况下编写嵌套序列化器。嵌套串行提到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

文件的东西在这里最大的问题是,你有IPNetwork(many=True)并设置IPNetworkListSerializer

应该知道这是redondant,因为许多= True会在场景后面创建一个ListSerializer。另请注意,ListSerializer旨在用于与您的实现不同的子序列化器。

因此,你应该简单地让IPNetwork继承自serializers.Serializer,你应该很好去。

非模型序列化器的工作原理大多与ModelSerializers相同,只是它们返回python字典,除非创建/更新被覆盖。请注意,在你使用嵌套序列化器的情况下,无论如何都应该重写这两个方法。

+0

谢谢。继承自serializers.Serializer。但没有实现创建/更新功能。仅使用序列化器进行数据验证。 –

好的。所以这就是我的做法,它很棒。

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 

让我知道这个代码或任何人有任何问题有任何疑问。