【问题标题】:how to patch only the foreign key of a nested serializer in django rest framework?如何仅修补 django rest 框架中嵌套序列化程序的外键?
【发布时间】:2021-08-02 04:58:56
【问题描述】:

我有一个嵌套的序列化程序,它将一些作为外键的字段绑定到相关对象,当我发出 get 请求时,我得到了我想要的数据,但是当我发出补丁请求时,我希望能够只提供外键 id 而不是整个对象表示。

编辑:

class Preferences(models.Model):
    user = models.ForeignKey(User, related_name='preferences', on_delete=models.CASCADE)
    current_patient = models.ForeignKey(Patient, null=True, on_delete=models.CASCADE, default=None)
    current_professional = models.ForeignKey(Professional, null=True, on_delete=models.CASCADE, default=None)
    current_entity = models.ForeignKey(Entity, null=True, on_delete=models.CASCADE, default=None)
    current_supervisor = models.ForeignKey(Supervisor, null=True, on_delete=models.CASCADE, default=None)



class PreferencesSerializer(serializers.ModelSerializer):
    current_patient = PatientSerializer(many=False)
    current_professional = ProfessionalSerializer(many=False)
    current_entity = EntitySerializer(many=False)
    current_supervisor = SupervisorSerializer(many=False)

    class Meta:
        model = Preferences
        fields = '__all__'


class PreferencesView(generics.RetrieveUpdateAPIView):
    serializer_class = PreferencesSerializer


    def get_object(self):
        return Preferences.objects.get(user=self.request.user)

【问题讨论】:

  • 对实现修补的视图集使用不同的序列化程序。
  • 但我希望能够像我当前的序列化程序一样获得包含数据的响应。
  • 但我没有看到问题:您制作了两种序列化程序,一种使用嵌套数据进行检索,另一种使用主键放置/修补/...
  • 是的,但是我需要编写两个视图,或者一种复杂的方法来选择序列化程序,但我猜 patch 方法的响应与 get 方法的响应不同。
  • 您能分享一个您的代码示例吗?如果你这样做会更容易帮助你:)另外,请分享你提出的要求。

标签: python django django-rest-framework


【解决方案1】:

您可以覆盖视图的get_serializer_class 方法:

class PreferencesView(generics.RetrieveUpdateAPIView):
    def get_serializer_class(self):
        if self.request.method == "PATCH":
            return PatchPreferencesSerializer

        return PreferencesSerializer
        
    # ...

请参考 Django REST 文档:https://www.django-rest-framework.org/api-guide/generic-views/#attributes

【讨论】:

    猜你喜欢
    • 2019-12-23
    • 2021-06-23
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2015-08-14
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多