我有以下视图集,
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
来修复错误,但我不想在序列化数据中添加它。我有什么选择?
答案 0 :(得分:1)
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
答案 1 :(得分: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')
)
]