【发布时间】:2016-08-09 18:08:49
【问题描述】:
假设我有两个模型:
class IPAddress(models.Model):
address = models.CharField()
class Rule(models.Model):
name = models.CharField()
ips = models.ManyToMany(IPAddress)
我希望能够通过如下请求添加规则:
{
"name":"Foo",
"ips":["192.168.1.40", "4.4.4.4", "8.8.8.8"]
}
我还想在每个请求中为新规则构造ip(没有直接构造ip的url),所以我为管理器编写了一个这样的类:
class RuleManager(models.Manager):
def create(self, validated_data):
rule = Rule(name=validate_data['name'])
rule.save()
rule.ips = [IPAddress.objects.get_or_create(item.lower()) for item in validated_data['ips']]
但是在序列化程序中我找不到合适的方式来展示这一点,我编写了一个这样的序列化程序:
class RuleSerializer(serializers.Serializer):
name = serializers.CharField()
ips = serializers.SlugRelatedField(many=True, slug_field='address', validators=[], queryset=models.IPAddress.objects.all())
但问题是它会验证请求中的 ip,如果没有这样的 ip,它会返回错误,尽管我将验证器设置为空列表。
我有两个问题,如何禁用此验证?我编写序列化程序和模型的方式是否适合我的场景(我无法更改收到的请求和必须发送的响应)
【问题讨论】:
-
您需要嵌套序列化程序来通过 API 创建
ips,还是只需要在已创建 ips 的地方进行只读。
标签: python django django-models django-rest-framework