2017-09-15 70 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