Django Rest FrameWork Добавить модель с внешним ключом пользователя - PullRequest
0 голосов
/ 01 апреля 2020

Я использую Django версию 3 и Rest Framework, у меня есть модель с иностранным ключом пользователя.
, поэтому каждый раз, когда модель сохраняется, пользователь также должен быть сохранен.
Чтобы иметь возможность чтобы добавить или отредактировать модель с помощью rest, вам необходимо пройти аутентификацию с использованием токена.
Я использую ClassBasedViews, проблема в том, что я не могу найти способ добавить модель, потому что в моем сериализаторе полевой пользователь исключен, потому что я не хочу, чтобы он был редактируемым.

models.py:

class Chambre(models.Model):
    local_id=models.PositiveIntegerField(unique=True)
    nom=models.CharField(max_length=255)
    user=models.ForeignKey(User,on_delete=models.CASCADE,blank='true')

    class Meta:
        unique_together = ('local_id', 'user',)

serializers.py:

class ChambreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chambre
        exclude =['user',] 

views.py:

class ChambreListApi(APIView):
"""
List all chambres, or create a new chambre.
"""
    authentication_classes=(TokenAuthentication,)
    permission_classes=(IsAuthenticated,)


    def get(self, request, format=None):
        chambres = Chambre.objects.filter(user=request.user)
        serializer = ChambreSerializer(chambres, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = ChambreSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(commit=False)
            serializer.user=request.user
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

спасибо за ответ, который был очень полезен, я решил его, добавив метод к serializer.py следующим образом:

class ChambreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chambre
        exclude =['user',]


    def set_the_user(self,request):
        self.user=request.user

    def create(self, validated_data):
        validated_data["user"] = self.user
        return super().create(validated_data)  

и в views.py:

def post(self, request, format=None):
    serializer = ChambreSerializer(data=request.data)
    serializer.set_the_user(request)
    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)
0 голосов
/ 01 апреля 2020

Попробуйте переместить логи c, которые устанавливают пользователя для сериализатора. По умолчанию GenericAPIView передает запрос сериализатору через контекст.

class ChambreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chambre
        exclude =['user',]

    def create(self, validated_data):
        validated_data["user"] = self.context["request"].user
        return super().create(validated_data)
...