2017-12-03 28 views
0

Django Rest Frameworkのtutorialにあるコードに投票機能を追加しようとしています。スニペットモデルの上に、私は投票モデルを追加しました:私のシリアライザでDjango Rest Frameworkの読み取り専用フィールドを検証する方法

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がデータ構造で利用できないことです。読み取り専用フィールドでどのように検証できますか?

編集:ここに私のビューがすでに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

です:

ので、あなたのコードは次のようなものでなければなりません:

if self.context['request'].user == data['snippet'].owner: 
     raise serializers.ValidationError(u"Voter cannot vote for himself.") 

あなたはperform_createを削除してこのisteadを使用できます

+0

すごく、ありがとう。 – Patrick