Mithril
Mithril

Reputation: 13718

django-rest-framework deserialize request to create a object with user foreign key

I'd like to create a SpiderService with a foreign key request.user.

models:

from django.contrib.auth.models import User

class SpiderService(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=20)

serializers:

class SpiderServiceSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.id')

    class Meta:
        model = SpiderService
        fields = ('id', 'user', 'name') 

class SpiderServiceListSerializer(viewsets.ModelViewSet):
    queryset = SpiderService.objects.all()
    serializer_class = SpiderService

views:

class SpiderServiceList(APIView):

    def get(self, request, format=None):
        services = SpiderService.objects.all()
        serializer = SpiderServiceSerializer(services, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SpiderServiceSerializer(data=request.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)

    def perform_create(elf, serializer):
        serializer.save(user=self.request.user)

when I post

{
    "name": "2"
}

to the api url, got 500 error:

[01/Feb/2016 15:39:55] "POST /services/ HTTP/1.1" 500 17105
IntegrityError: NOT NULL constraint failed: spmanage_spiderservice.user_id

I have read Serializer relations and found I should not write code as above. The official example is equal to remove user field in SpiderServiceSerializer, and add a spiderservice field to a UserSerializer.Seems aim to achieve the syntax like user.spiderservice_set in django models, which do not fit my purpose.

I just want to create a spiderservice object with request.user.

How to solve it?

Upvotes: 2

Views: 1031

Answers (2)

Linovia
Linovia

Reputation: 20966

You need to add the current user as an extra parameter to the Serializer's save method:

serializer.save(user=request.user)

Upvotes: 2

Soufiaane
Soufiaane

Reputation: 2087

do you have any Account serializer for the user model ??
if so, in your SpiderServiceSerializer try this :

user = AccountSerializer(read_only=True, required=False)

Upvotes: 0

Related Questions