Как переопределить viewsets.ModelViewSet в Django REST Framework? - PullRequest
0 голосов
/ 09 мая 2020

Итак, моя модель проста как

class Face(models.Model):
    uid = models.CharField(max_length=510, primary_key=True)
    photo = models.ImageField(upload_to='face_photos')

сериализатор

class FaceSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Face
        fields = ['uid', 'photo']
        extra_kwargs = {'uid': {'required': True}, 'photo': {'required': True}}

и вид должен быть примерно таким:

class FaceViewSet(viewsets.ModelViewSet):
    queryset = Face.objects.all()
    serializer_class = FaceSerializer
    permission_classes = [permissions.AllowAny]

И это работает. Однако:

  1. Я не хочу перечислять, обновлять, удалять параметры. Только POST и GET.
  2. Я хочу добавить свой лог c в сообщение, поэтому, если uid существует, обновите, иначе создайте ... а также другую обработку.
  3. Я хочу индивидуальный ответ после POST.

Как мне добиться всего этого, не теряя всех преимуществ, которые предоставляет viewsets.ModelViewSet, таких как проверки, автоматически сгенерированные поля HTML в веб-представлении Rest API и т. Д. c?

1 Ответ

1 голос
/ 09 мая 2020

Это сработало для меня:

class FaceViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    """
    API endpoint for adding and processing new client (by uid) face
    """
    queryset = Face.objects.all()
    serializer_class = FaceSerializer
    permission_classes = [permissions.AllowAny]

    def create(self, request):
        if "uid" in request.POST:
            try:
                instance = Face.objects.get(pk=request.POST['uid'])
                serializer = FaceSerializer(
                    instance=instance,
                    data=request.data
                )
            except Face.DoesNotExist:
                serializer = FaceSerializer(data=request.data)
        else:
            serializer = FaceSerializer(data=request.data)

        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data)

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = FaceSerializer(instance=instance)
        return Response(serializer.data)
...