blaziken105
blaziken105

Reputation: 501

create object with foreign key to User DRF

I am using the django rest framework and I have a very simple model of Posts for a particular user which I have serialised in the following manner.

Serializers.py

class PostSerializer(serializers.HyperlinkedModelSerializer):
    image = serializers.ImageField(max_length=None, use_url=True)
    question = serializers.CharField(required=False)
    ayes = serializers.CharField(required=False)
    nays = serializers.CharField(required=False)
    neutrals = serializers.CharField(required=False)

    class Meta:
        model = Posts
        fields = ('user','question', 'image','ayes', 'nays', 'neutrals')

My models.py is as follows

class Posts(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    question = models.TextField(max_length=500, blank=True)
    image = models.ImageField('optionalImage', upload_to='images/posts/', default='/images/posts/blank.png')
    ayes = models.TextField(max_length=200, default=0)
    nays = models.TextField(max_length=200, default=0)
    neutrals = models.TextField(max_length=200, default=0)

When I tried posting to this I kept getting NOT NULL Integrity constraint error of user_id. Hence I added context={'request': request}) to the serializer which ends up giving me the following error:

Could not resolve URL for hyperlinked relationship using view name "user-detail". You may have failed to include the related model in your API, or incorrectly configured the lookup_field attribute on this field.

My views.py is as follows: views.py

@permission_classes((IsAuthenticated, ))
class PostsView(generics.ListCreateAPIView):
    queryset = Posts.objects.all()
    serializer_class = PostSerializer

    def get(self, request, format=None):
        snippets = Posts.objects.filter(pk=request.user.id)
        serializer = PostSerializer(snippets, many=True,context={'request': request})
        return Response(serializer.data)

    def post(self, request, format=None):
        posts = PostSerializer(data=request.data,context={'request': request})
        if posts.is_valid():
            posts.save()
            return Response("YOLO", status=status.HTTP_201_CREATED)
        else:
            return Response(posts.errors, status=status.HTTP_400_BAD_REQUEST)

All other fields of mine have posted correctly when I set default=0 in my model for user. I am unable to submit the foreign key user which needs to be saved on every post. What am I doing wrong here? Am I following the correct method?

Upvotes: 0

Views: 1388

Answers (1)

Linovia
Linovia

Reputation: 20966

Since you don't want to send your user, you should remove it from the serializer's field. Next, you want to set the post's user to the current user. To achieve that, you want to pass the request.user to the serializer's data by changing the save method to:

posts.save(user=request.user)

It's explained in the documentation and in the tutorial

Upvotes: 3

Related Questions