我的DataSerliazer
中有一个自定义验证函数,它检查两个参数(mrange,mthreshold)。验证功能检查在过帐时是否只需要设置其中一个参数。
class DataSerializer(serializers.ModelSerializer):
emails = serializers.ListField(child = serializers.EmailField())
class Meta:
model = AIData
fields = ('id', 'name', 'created', 'username', 'token',
'expression','key','threshold' ,'evaluator', 'range','emails','metric_name', 'status')
def validate(self,attrs):
mrange = attrs.get("metric_range")
mthreshold = attrs.get("metric_threshold")
if (mrange == None or mrange == " ") and (mthreshold == None or mthreshold == " "):
raise serializers.ValidationError({'error': 'Cannot have both range and threshold empty'})
elif mrange != None and mthreshold != None:
raise serializers.ValidationError({'error': 'Cannot set both range and threshold'})
在我的views.py文件
@api_view(['GET','PUT', 'DELETE'])
def ai_detail(request, token, id):
ai = None
try:
ai = AIData.objects.get(id=id)
except AIData.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = DataSerializer(ai)
if serializer.data['token'] == token:
return Response(serializer.data)
else:
return Response({'error': 'Not allowed to access'}, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'PUT':
serializer = AlAnotherSerializerMethod(alert, data=request.data, partial=True)
if serializer.is_valid():
// updating code
目前,我必须编写一个AIAnotherSerializerMethod
,这样它就不会隐式调用DataSerializer中的validate函数。这是为了避免在创建对象时检查这两个参数。一旦创建了对象,我就不想再检查同一个函数了。有没有更整洁的方法可以做到这一点?我最好避免为同一个模型编写2个序列化程序。
您可以将context
数据传递给序列化程序,其中可能包括请求本身。
通过调用self.text.,您可以在序列化程序中的任何时间、任何地方访问上下文
此解决方案确实使提供上下文数据变得更容易,而无需覆盖__init__
。
据我所知,rest框架库没有类似的东西。
我这样做的方法是覆盖__init__
并添加您自己的变量来检查它。
class DataSerializer(serializers.ModelSerializer):
emails = serializers.ListField(child = serializers.EmailField())
class Meta:
model = AIData
fields = ('id', 'name', 'created', 'username', 'token',
'expression','key','threshold' ,'evaluator', 'range','emails','metric_name', 'status')
def __init__(self, *args, **kwargs):
super(DataSerializer, self).__init__(*args, **kwargs)
self._request_method = kwargs.get('request_method', 'GET')
def validate(self,attrs):
if self._request_method == 'GET':
# GET logic
elif self._request_method in ('PUT', 'POST'):
# Put or Post logic
然后我会这样使用它:
serializer = DataSerializer(ai, request_method=request.method)