DRF сериализует и сохраняет модель с пользователем FK - PullRequest
0 голосов
/ 26 января 2019

models.py

class UserContentItem(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    created_date = models.DateTimeField(default=timezone.now)

views.py

class UserContentItemView(APIView):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, )

    def post(self, request, format=None):
        data = request.data
        data['owner'] = request.user.id
        serializer = UserContentItemSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py

class UserContentItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserContentItem
        fields = ('id', 'owner', 'title', 'created_date')

Я создаю API с помощью Django Rest Framework и простого jwt. Я хочу разрешить аутентифицированным пользователям POST новый UserContentItem, который зависит от FK от User, но User не является частью полезной нагрузки POST. Единственный способ, которым я смог выяснить, как это сделать - это добавить request.user.id к данным запроса перед его передачей в сериализатор. Есть ли лучший способ сериализации UserContentItem и достижения той же цели?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Ваш подход хорош, даже если вы можете следовать этим

serializer.save(owner=self.request.user)
0 голосов
/ 26 января 2019

Я думаю, что вы можете попробовать это, используя CurrentUserDefault :

class UserContentItemSerializer(serializers.ModelSerializer):

    owner = serializers.PrimaryKeyRelatedField(
        read_only=True, 
        default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = UserContentItem
        fields = ('id', 'owner', 'title', 'created_date')

И, с точки зрения, передать запрос в качестве контекста в сериализатор:

serializer = UserContentItemSerializer(data=data,context={'request':request})

Также вам не нужно передавать идентификатор пользователя с data.

...