Django RF, невозможно передать экземпляр пользователя в метод serializer.save () - PullRequest
0 голосов
/ 07 мая 2020

У меня есть проект блога, где пользователи авторизации могут публиковать новые сообщения. При отправке сообщения POST на сервер невозможно добавить зарегистрированного пользователя с новыми сообщениями.

VIEWS.PY

class PostListCreate(APIView):
    parser_class = (FileUploadParser,)
    permission_classes = [IsAuthenticatedOrReadOnly]

    def post(self,request):
        #postAuthor = self.request.user
        serializer = PostSerializers(data=request.data,context={'request':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)

SERIALIZER.PY

class PostSerializers(serializers.ModelSerializer):
    comments = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name = 'comment_details')
    likes_count = serializers.SerializerMethodField()
    user_has_voted = serializers.SerializerMethodField()
   # postAuthor = serializers.SerializerMethodField()
    class Meta:
        model = Post
        fields = '__all__'
        #exclude=('voters',)

    def get_likes_count(self, instance):
        return instance.voters.count()

    def get_user_has_voted(self, instance):
        request = self.context.get("request")
        return instance.voters.filter(pk=request.user.pk).exists()

СООБЩЕНИЕ ОБ ОШИБКЕ

{
    "postAuthor": [
        "This field is required."
    ]
}

МОДЕЛИ.PY

from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=60)
    body = models.CharField(max_length=60)
    file = models.FileField(null=True,blank=True)
    postAuthor = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='posts')
    voters = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                    related_name="votes",blank=True)

Ответы [ 2 ]

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

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

все поля обязательны, но postAuthor не передается с входными данными.

class PostSerializers(serializers.ModelSerializer):
    comments = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name = 'comment_details')
    likes_count = serializers.SerializerMethodField()
    user_has_voted = serializers.SerializerMethodField()
   # postAuthor = serializers.SerializerMethodField()
    class Meta:
        model = Post
        fields = '__all__'
        #exclude=('voters',)

    def get_likes_count(self, instance):
        return instance.voters.count()

    def get_user_has_voted(self, instance):
        request = self.context.get("request")
        return instance.voters.filter(pk=request.user.pk).exists()

в сериализаторе измените

fields = '__all__'

на

exclude=('postAuthor',)

и в представлениях измените

if serializer.is_valid():
            serializer.save()

на

if serializer.is_valid():
            serializer.save(postAuthor=request.user)

, это должно помочь

1 голос
/ 07 мая 2020
    def post(self, request):
        request.data["postAuthor"] = request.user
        serializer = PostSerializers(data=request.data, context={'request': 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)

Попробуйте это.

...