我尝试在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')
答案 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的分隔符。然后内部表示是以冒号分隔的版本。