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

Embeded serializers in DRF for mongo and django

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

这里最大的问题是您有 IPNetwork(many=True) 并将 IPNetwork 设置为 ListSerializer

应该知道这是重复的,因为 many=True 在幕后创建了一个 ListSerializer。另请注意,ListSerializer 旨在使用与您的实现不同的子序列化程序。

因此,您只需让 IPNetwork 继承自 serializers.Serializer 就可以了。

非模型序列化器的工作原理 - 大部分 - 与 ModelSerializers 相同,除了它们 return python 字典,除非 create/update 被覆盖。请注意,在您使用嵌套序列化程序的情况下,无论如何都应该覆盖这两个方法。

好的。所以我就是这样做的,效果很好。

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

如果此代码有任何问题或任何人有任何疑问,请告诉我。