我正在尝试在Django Rest Framework中创建一个非模型嵌入式序列化器。我被困在这里需要你的帮助。提前谢谢。
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数据,然后调用save函数。
我想要类似于嵌入式文档mongoengine
的内容答案 0 :(得分:0)
这里最大的问题是你有IPNetwork(many=True)
并将IPNetwork
设为ListSerializer
。
应该知道这是redondant,因为很多= True会在场景后面创建一个ListSerializer
。另请注意,ListSerializer
旨在与子序列化程序一起使用,这与您的实现不同。
因此,您只需将IPNetwork
继承自serializers.Serializer
即可继续使用。
非模型序列化程序的工作原理 - 大部分 - 与ModelSerializers
相同,除非它们返回python词典,除非重写create / update。请注意,在使用嵌套序列化程序的情况下,无论如何都应该重写这两种方法。
答案 1 :(得分: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
如果此代码或任何人有任何疑问,请与我们联系。