Python ';请求';对象没有属性';流行音乐';在Django Rest框架中?

Python ';请求';对象没有属性';流行音乐';在Django Rest框架中?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个Post型号,外键为User型号。因此,当我创建Post对象时,我需要通过覆盖ModelViewSet中的create方法来传递用户实例,但失败了 以下是我尝试过的: models.py class Post(models.Model): author = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE) title = models.CharField(ma

我有一个
Post
型号,外键为
User
型号。因此,当我创建
Post
对象时,我需要通过覆盖
ModelViewSet
中的
create
方法来传递用户实例,但失败了

以下是我尝试过的:

models.py

class Post(models.Model):
    author = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    content = models.TextField()
序列化程序.py

class PostSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="api:posts-detail")
    author = UserSerializer()

    class Meta:
        model = models.Post
        fields = ['url', 'id', 'author', 'title', 'content']
views.py

class PostViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.PostSerializer

    def get_queryset(self, *args, **kwargs):
        user = self.request.user
        return models.Post.objects.all().filter(author=user)

    permission_classes_by_action = {
        'create': [permissions.IsAuthenticated],
        'list': [permissions.IsAuthenticated],
        # other permissions..
    }

    def create(self, validated_data):
        author = validated_data.pop('author_id')
        print(author)
        post = models.Post.objects.create(author=author, **validated_data)
        return post

    def list(self, request, *args, **kwargs):
        return super(PostViewSet, self).list(request, *args, **kwargs)

    # other methods

    def get_permissions(self):
        try:
            # return permission_classes depending on `action`
            return [permission() for permission in self.permission_classes_by_action[self.action]]
        except KeyError:
            # action is not set return default permission_classes
            return [permission() for permission in self.permission_classes]
我犯的全部错误

Traceback (most recent call last):
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/muongkimhong/Developments/django-api/new_api/api/views.py", line 76, in create
    author = validated_data.pop('author_id')
  File "/Users/muongkimhong/Developments/django-api/env/lib/python3.8/site-packages/rest_framework/request.py", line 418, in __getattr__
    return self.__getattribute__(attr)
AttributeError: 'Request' object has no attribute 'pop'
[29/Sep/2020 09:50:36] "POST /api/posts/ HTTP/1.1" 500 103017
如果您需要更多信息,我可以提供更多。错误来自ModelViewSet内的create方法


谢谢

您将
ModelViewSet.create的方法与
ModelSerializer.create混为一谈。您需要将其放入序列化程序中,如下所示:

class PostSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="api:posts-detail")
    author = UserSerializer(read_only=True)

    class Meta:
        model = models.Post
        fields = ['url', 'id', 'author', 'title', 'content']

    def create(self, validated_data):
        author = self.context['request'].user
        post = models.Post.objects.create(author=author, **validated_data)
        return post

对不起,我有一些误解,但谢谢!