Django Rest Framework tutorial에있는 코드에 투표 기능을 추가하려고합니다. 발췌문 모델의 위에, 나는 투표 모델 추가 :Django Rest Framework에서 읽기 전용 필드 유효성을 검사하는 방법
class VoteSerializer(serializers.HyperlinkedModelSerializer):
voter = serializers.ReadOnlyField(source='voter.username',validators=[UniqueValidator(queryset=Vote.objects.all(), message=already_voted)])
snippet = serializers.PrimaryKeyRelatedField(queryset=Snippet.objects.all())
def validate(self, data):
snippet = data.get('snippet')
voter = data.get('voter')
if voter==data['snippet'].owner:
raise serializers.ValidationError(u"Voter cannot vote for himself.")
return data
: 내 시리얼에
class Vote(models.Model):
created = models.DateTimeField(auto_now_add=True)
voter = models.ForeignKey(User, on_delete=models.CASCADE)
snippet = models.ForeignKey(Snippet, related_name='votes', on_delete=models.CASCADE)
class Meta:
ordering = ('created',)
을, 나는 사용자가 한 번 이상 투표 할 수 있으며, 자신의 조각 투표 수 없다는 사실을 확인하기 위해 노력하고있어
유권자 필드는 읽기 전용이어야합니다. 문제는 데이터 구조에서 ReadOnlyField를 사용할 수 없다는 것입니다. 읽기 전용 필드를 사용하여 유효성을 검사하려면 어떻게해야합니까?
편집 :
if self.context['request'].user == data['snippet'].owner:
raise serializers.ValidationError(u"Voter cannot vote for himself.")
:
이그래서 당신의 코드는 다음과 같이해야한다 : 여기 당신은 이미 self.context['request'].user
와 현재 사용자에 액세스 할 수 귀하의 시리얼에서 내보기
class VoteViewSet(viewsets.ModelViewSet):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
queryset = Vote.objects.all()
serializer_class = VoteSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
def perform_create(self, serializer):
serializer.save(voter=self.request.user)
Can y 당신의 견해가 포함되어 있습니까? – dkarchmer
물론 내 의견을 포함하도록 내 게시물을 편집했습니다. 당신의 도움을 주셔서 감사합니다. – Patrick
하나의 솔루션 (내가하는 일)은 대신 perform_create 메소드에서이 검사를 수행하는 것입니다. – dkarchmer