在DRF中为mongo和django嵌入了序列化程序

时间:2017-02-20 11:06:18

标签: python django mongodb django-rest-framework mongoengine

我正在尝试在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

的内容

2 个答案:

答案 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

如果此代码或任何人有任何疑问,请与我们联系。