gpt4 book ai didi

django - DRF : accessing a SerializerMethodField during serializer validation

转载 作者:行者123 更新时间:2023-12-01 02:12:35 25 4
gpt4 key购买 nike

我正在使用 Django Rest Framework 3.0 并且我有一个模型:

class Vote(models.Model):
name = ...
token = models.CharField(max_length=50)

哪里 token是我从 request 生成的唯一标识符防止同一个用户两次投票的IP信息

我有一个序列化程序:
class VoteSerializer(serializers.ModelSerializer):
name = ...
token = serializers.SerializerMethodField()

class Meta:
model = Vote
fields = ("id", "name", "token")

def validate(self, data):
if Rating.objects.filter(token=data['token'], name=data['name']).exists():
raise serializers.ValidationError("You have already voted for this")
return data

def get_token(self, request):
s = ''.join((self.context['request'].META['REMOTE_ADDR'], self.context['request'].META.get('HTTP_USER_AGENT', '')))
return md5(s).hexdigest()

和一个 CreateView
但我得到了一个
KeyError: 'token' 

当我尝试发布并创建一个新的 Vote 时.为什么是 token验证时字段未包含在数据中?

The docs mention :

It can be used to add any sort of data to the serialized representation of your object.



所以我原以为它也可以在 validate 期间使用?

最佳答案

查了一下,好像SerializerMethodField在验证发生后调用字段(没有深入研究代码,我不知道为什么会这样 - 这似乎违反直觉)。

相反,我将相关代码移到了 View 中(老实说,这在概念上实际上更有意义)。

为了让它工作,我需要做以下事情:

class VoteCreateView(generics.CreateAPIView):
serializer_class = VoteSerializer

def get_serializer(self, *args, **kwargs):
# kwarg.data is a request MergedDict which is immutable so we have
# to copy the data to a dict first before inserting our token
d = {}
for k, v in kwargs['data'].iteritems():
d[k] = v
d['token'] = self.get_token()
kwargs['data'] = d
return super(RatingCreateView, self).get_serializer(*args, **kwargs)

def get_token(self):
s = ''.join((self.request.META['REMOTE_ADDR'], self.request.META.get('HTTP_USER_AGENT', '')))
return md5(s).hexdigest()

我真的希望这不是正确的方法,因为对于看起来非常简单的情况来说,这似乎完全令人费解。希望其他人可以发布更好的方法。

关于django - DRF : accessing a SerializerMethodField during serializer validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com