清理django RESTful输入会导致路由错误

时间:2015-04-21 21:08:45

标签: python django django-rest-framework

我尝试在API中验证MAC地址,并将其重新格式化为一致的内部表示。

以下代码正确填充表,但是当尝试为该表创建视图时,django会抛出错误。

它抱怨" nic-detail"找不到。我猜测发生了什么是url使用传入的值更新到验证函数而不是更新的值。有不同的方式吗?

class NICSerializer(serializers.HyperlinkedModelSerializer):
    def validate_mac(self, value):
        regex = re.compile(r'^([0-9a-f]{2}([-:\.]?)[0-9a-f]{2}(\2[0-9a-f]{2}){4})$')

        m = regex.match(value)

        if not m:
            raise serializers.ValidationError("Not a valid mac address")
        return value

        sep = m.groups()[1]
        if sep != '':
            return m.groups[0].replace(sep,'.')
        else:
            return '.'.join([m.groups()[0][x:x+2] for x in range(0,len(m.groups()[0]),2)])

    class Meta:
        model = models.NIC
        fields = ('url', 'mac', 'system')

2 个答案:

答案 0 :(得分:0)

您的观点是否有queryset字段?如果没有,则需要在base_name中使用DRF路由器注册视图时指定urls.py参数。 See rest_framework.routers usage

答案 1 :(得分:0)

自从我提出这个问题以来已经有一段时间了,但我最终找到了一个似乎运作良好的解决方案:

创建MACField序列化器字段:

class MACField(serializers.Field):

    def validate(self, value):
        regex = re.compile(
            r'^([0-9a-fA-F]{2}([:\-.])[0-9a-fA-F]{2}(\2[0-9a-fA-F]{2}){4})$'
        )
        m = regex.match(value)

        if not m:
            raise serializers.ValidationError(
                'Not a valid mac address.'
            )
        return m.groups()[1]

    def to_representation(self, obj):
        return obj

    def to_internal_value(self, data):
        delimiter = self.validate(data)
        return ':'.join(data.lower().split(delimiter))

然后在序列化程序类中使用它:

class NICSerializer(serializers.HyperlinkedModelSerializer):
    mac = MACField()

    class Meta:
        model = models.NIC
        fields = ('url', 'mac', 'system')

现在,如果有人输入了无效的MAC,则会引发ValidationError,如果有效,则validate函数返回MAC的分隔符。然后内部表示是以冒号分隔的版本。