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

Cleaning django RESTful input causes routing error

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

以下代码正确地填充了 table,但是当尝试为 table 创建视图时 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}([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')

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

我问这个问题已经有一段时间了,但我最终得到了一个似乎运行良好的解决方案:

创建一个MAC字段序列化器字段:

class MACField(serializers.Field):

    def validate(self, value):
        regex = re.compile(
            r'^([0-9a-fA-F]{2}([:\-.])[0-9a-fA-F]{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:

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

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

现在,如果有人输入无效的 MAC,则会引发 ValidationError,如果有效,则 validate 函数 returns [= 的定界字符23=]。内部表示就是冒号分隔的版本。