2017-09-15 88 views
1

我有以下視圖集,驗證序列化對象,而該領域需要驗證

class VoteViewSet(viewsets.ModelViewSet): 
    serializer_class = VoteSerializer 
    permission_classes = [IsAuthenticated] 

    def perform_create(self, serializer): 
     serializer.save(created_by=self.request.user) 

    def get_queryset(self): 
     return Vote.objects.filter(created_by=self.request.user) 

串行

class VoteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Vote 
     fields = ('id', 'request') 
     read_only_fields = ('id',) 

和型號。

class Vote(models.Model): 
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='votes') 
    request = models.ForeignKey(Request, related_name='votes') 

    class Meta: 
     unique_together = [('request', 'created_by')] 

我想保存用戶的投票,但我得到IntegrityError: UNIQUE constraint failed當我張貼了同樣的要求進行表決的兩倍。我可以通過將created_by添加到VoteSerializer來修復錯誤,但我不想在我的序列化數據中使用它。我有什麼選擇?

回答

1

你可以嘗試object-level-validation

class VoteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Vote 
     fields = ('id', 'request') 
     read_only_fields = ('id',) 

    def validate(self, data): 
     """ 
     Check Unique vote per user. 
     """ 
     created_by = self.context['request'].user 
     if self.instance is None: 
      Vote(**data, created_by=created_by).full_clean() 
     else: 
      self.instance.created_by = created_by 
      self.instance.full_clean() 
     return data 
+0

謝謝,這可能會工作。不過我不喜歡那個,現在我們在兩個不同的地方進行驗證。一旦進入模型(unique_together)和串行器。 – Zoli

+0

在你有保存規則的模型中,在序列化程序中你有數據驗證它是不一樣的。 –

+0

謝謝你,解決方案工作,但不是手動驗證條件,我使用了'投票(**數據,created_by = created_by).full_clean()'。 – Zoli

1
from rest_framework.validators import UniqueTogetherValidator 

class ExampleSerializer(serializers.Serializer): 
    # ... 
    class Meta: 
     # ToDo items belong to a parent list, and have an ordering defined 
     # by the 'position' field. No two items in a given list may share 
     # the same position. 
     validators = [ 
      UniqueTogetherValidator(
       queryset=ToDoItem.objects.all(), 
       fields=('list', 'position') 
      ) 
     ] 

UniqueTogetherValidator

+0

'unique_together'你有錯誤的邏輯 –

+0

以及你可以查看更新的答案。 – KyleDing