Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Rest框架:viewset或序列化程序中需要外键字段_Django_Django Rest Framework_Django Serializer_Django Rest Viewsets - Fatal编程技术网

Django Rest框架:viewset或序列化程序中需要外键字段

Django Rest框架:viewset或序列化程序中需要外键字段,django,django-rest-framework,django-serializer,django-rest-viewsets,Django,Django Rest Framework,Django Serializer,Django Rest Viewsets,我对Django Rest框架(DRF)非常陌生。我曾读到viewset非常好,因为它减少了代码量,但我发现它更复杂 说明: 假设我想实现一个电话簿API,其中我们有一些用户,每个用户都有自己的联系人,每个联系人可以有几个电话号码。我这里有三个模型 用户(默认Django模型) 接触 电话号码 问题定义 我想要的是使用当前的请求创建新联系人。user。因此,我应该让我的联系人.serializer如下所示: class ContactSerializer(serializers.ModelSer

我对Django Rest框架(DRF)非常陌生。我曾读到
viewset
非常好,因为它减少了代码量,但我发现它更复杂

说明: 假设我想实现一个电话簿API,其中我们有一些用户,每个用户都有自己的联系人,每个联系人可以有几个电话号码。我这里有三个模型

  • 用户(默认Django模型)
  • 接触
  • 电话号码
  • 问题定义 我想要的是使用当前的
    请求创建新联系人。user
    。因此,我应该让我的
    联系人.serializer
    如下所示:

    class ContactSerializer(serializers.ModelSerializer):
        owner = serializers.SlugRelatedField(queryset=User.objects.all(), slug_field='user')
    
    
        class Meta:
            model = Contact
            fields = ['id', 'owner', 'name', 'description']
            read_only_fields = ['owner']
    
    我的观点是:

    
    class ContactViewSet(viewsets.ModelViewSet):
        queryset = Contact.objects.all()
        serializer_class = ContactSerializer
        permission_classes = [IsCreator]
    
        def get_permissions(self):
            if self.request.method == "GET":
                self.permission_classes = [IsCreator, permissions.IsAdminUser,]
    
            if self.request.method == "POST":
                self.permission_classes = [permissions.IsAuthenticated,]
    
            if self.request.method == "PUT":
                self.permission_classes = [IsCreator]
    
            if self.request.method == "DELETE":
                self.permission_classes = []
    
            return super(ContactViewSet, self).get_permissions()
    
    错误每当我想使用
    邮递员
    发布新联系人时,我都会传递
    姓名
    说明
    所有者
    ,它应该会从请求中自动检测到所有者,但它没有,我收到以下错误:

    PS:如果需要在此处签出项目,请单击此处


    我该怎么办?

    应用以下更改后,问题得到解决

    apps.contacts.views.py

    class ContactSerializer(serializers.ModelSerializer):
        class Meta:
            model = Contact
            fields = ['id', 'name', 'description', 'owner']
    
    将以下方法添加到类的主体中

    def perform_create(self, serializer):
        return serializer.save(owner = self.request.user)
    
    apps.contacts.serializers.py

    class ContactSerializer(serializers.ModelSerializer):
        class Meta:
            model = Contact
            fields = ['id', 'name', 'description', 'owner']
    

    PS我也在寻找更多答案,在本例中添加您的答案。

    应用以下更改后,问题已解决

    apps.contacts.views.py

    class ContactSerializer(serializers.ModelSerializer):
        class Meta:
            model = Contact
            fields = ['id', 'name', 'description', 'owner']
    
    将以下方法添加到类的主体中

    def perform_create(self, serializer):
        return serializer.save(owner = self.request.user)
    
    apps.contacts.serializers.py

    class ContactSerializer(serializers.ModelSerializer):
        class Meta:
            model = Contact
            fields = ['id', 'name', 'description', 'owner']
    

    PS我也在寻找更多答案,在本例中添加您的答案。

    您可以做的一件事是添加currentuserdefault。像这样

    class ContactSerializer(serializers.ModelSerializer):
        owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
    
        class Meta:
            model = Contact
            fields = ['id', 'owner', 'name', 'description']
    
    在您的视图代码中,请记住在上下文中传递请求。像这样

    class ContactViewSet(viewsets.ModelViewSet):
        queryset = Contact.objects.all()
        serializer_class = ContactSerializer
        permission_classes = [IsCreator]
    
        def get_serializer_context(self):
            context = super().get_serializer_context()
            context.update({"request": self.request})
            return context
    

    您可以做的一件事是添加currentuserdefault。像这样

    class ContactSerializer(serializers.ModelSerializer):
        owner = serializers.HiddenField(default=serializers.CurrentUserDefault())
    
        class Meta:
            model = Contact
            fields = ['id', 'owner', 'name', 'description']
    
    在您的视图代码中,请记住在上下文中传递请求。像这样

    class ContactViewSet(viewsets.ModelViewSet):
        queryset = Contact.objects.all()
        serializer_class = ContactSerializer
        permission_classes = [IsCreator]
    
        def get_serializer_context(self):
            context = super().get_serializer_context()
            context.update({"request": self.request})
            return context
    

    它应该会自动从请求中检测到所有者
    但是我没有看到任何代码执行此操作?可能是相关的:@Alvi15请给我一个答案好吗?我真的需要你的帮助。请查看相关链接,看看它是否有效。@Alvi15我收到了一个新错误
    它应该会自动从请求中检测到所有者
    我没有看到任何代码执行此操作?可能相关:@Alvi15请给我一个答案好吗?我真的需要你的帮助。请查看相关链接,看看它是否有效。@Alvi15我收到了一个新错误
    TypeError:Field'id'需要一个数字,但得到了HiddenField(default=CurrentUserDefault())。
    这个错误刚刚发生。我已经安装了你的应用程序,并完成了我建议的上述更改,工作正常。但有一件事请确保在contactviewsets中删除此
    def perform\u create(self,serializer):返回serializer.save(owner=self.request.user)
    TypeError:Field'id'需要一个数字,但得到了HiddenField(default=CurrentUserDefault()).
    此错误刚刚发生。我已安装了你的应用程序,并执行了我建议的上述更改,其工作正常。但有一件事请确保在ContactViewSet中删除此
    def perform\u create(self,serializer):返回serializer.save(owner=self.request.user)