【发布时间】:2025-11-24 10:45:01
【问题描述】:
使用 Django Rest Framework 3、基于函数的视图和 ModelSerializer(更具体地说是 HyperlinkedModelSerializer)。
当用户从客户端提交表单时,我有一个视图,它获取请求数据,使用它调用外部 API,然后使用来自外部 API 的数据为模型序列化程序填充数据。 我相信这部分工作正常,根据我的阅读,您应该使用 context 和 validate()
在我的模型序列化程序中,到目前为止我只有一个被覆盖的函数:
from django.core.validators import URLValidator
def validate(self, data):
if 'foo_url' in self.context:
data['foo_url'] = self.context['foo_url']
URLValidator(data['foo_url'])
if 'bar_url' in self.context:
data['bar_url'] = self.context['bar_url']
URLValidator(data['bar_url'])
return super(SomeSerializer, self).validate(data)
以防万一,相关视图代码如下:
context = {'request': request}
...
context['foo_url'] = foo_url
context['bar_url'] = bar_url
s = SomeSerializer(data=request.data, context=context)
if s.is_valid():
s.save(user=request.user)
return Response(s.data, status=status.HTTP_201_CREATED)
现在假设我有正确的想法(我的模型确实从相应的上下文数据中填充了它的 foo_url 和 bar_url 字段),我感到困惑的是验证是如何不起作用的。如果我给它坏数据,模型序列化器不会拒绝它。
我假设在validate() 中,通过将上下文数据添加到数据中,将在调用is_valid() 时检查数据的有效性。可能不是这样,尤其是当我打印出s 时(在使用序列化程序之后但在调用is_valid() 之前),没有迹象表明请求对象的data 已经填充了来自validate() 的上下文数据(我没有'不知道是否应该)。
所以我尝试直接在 validate() 方法中调用 URLValidators,但似乎仍然无法正常工作。尽管给了它像'asdf'或空的python dict({})这样的无效数据,但没有错误。我的测试断言表明该字段确实包含无效数据,例如“{}”。
这样做的正确方法是什么?
【问题讨论】:
-
我也不明白它是如何通过 Django 的模型验证的,因为 'asdf' 或 '{}' 不是有效的 URLField 数据。
标签: django validation serialization django-rest-framework