2017-12-03 17 views
0

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) 
+0

Can y 당신의 견해가 포함되어 있습니까? – dkarchmer

+0

물론 내 의견을 포함하도록 내 게시물을 편집했습니다. 당신의 도움을 주셔서 감사합니다. – Patrick

+0

하나의 솔루션 (내가하는 일)은 대신 ​​perform_create 메소드에서이 검사를 수행하는 것입니다. – dkarchmer

답변

1

입니다 그래서 perform_create을 제거하고이 istead를 사용할 수 있습니다

+0

정말 고마워. – Patrick