【问题标题】:Django Rest Framework - Write for Relational nested SerializersDjango Rest Framework - 为关系嵌套序列化程序编写
【发布时间】:2020-11-23 21:01:34
【问题描述】:

我是 DRF 的新手,如有任何错误,我深表歉意。

例如,我有 Post 模型,其中 Author 作为 NewUser 模型的外键。当我列出帖子时,我希望获取包含作者详细信息的嵌套对象,而不是获取作者的主键,这就是我创建这样的序列化程序的原因。

class PostAuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = NewUser
        fields = ["id", "email", "user_name"]


class PostSerializer(serializers.ModelSerializer):
    author = PostAuthorSerializer()

    class Meta:
        model = Post
        read_only_fields = ("slug",)
        fields = (
            "id",
            "title",
            "author",
            "excerpt",
            "content",
            "status",
            "slug",
        )
        lookup_field = "slug"

但是,现在我不知道如何 /POST 回帖。我搜索了 2 天,但找不到正确的指南来了解如何做。我的主要目标是学习/理解而不是解决问题,所以一点解释也很棒!我真的很想学习 DRF,但我认为它在互联网上缺乏详细的文档和示例,或者至少我找不到我的问题的答案。

所以,我想学习两种发帖方式:

  1. 代表保持这种状态,但我仍然 /POST 一个显示“作者”的帖子:id
  2. 代表一直保持这种状态,我 /POST "author: {"email": "orkhan@test.com", "user_name":"orkan.test"}" 获得作者对象后仍然可以创建我的帖子

提前致谢!

【问题讨论】:

    标签: django rest serialization django-rest-framework


    【解决方案1】:

    当您设置作者字段如author = PostAuthorSerializer() 时,它不再是主键相关字段。为了实现您想要做的事情,您需要使用单独的定义(例如不同的序列化程序)进行读取和写入。

    但我会建议这样的解决方法:

    class PostAuthorSerializer(serializers.ModelSerializer):
        class Meta:
            model = NewUser
            fields = ["id", "email", "user_name"]
    
    
    class PostSerializer(serializers.ModelSerializer):
        author_data = serializers.SerializerMethodField()
    
        class Meta:
            model = Post
            read_only_fields = ("slug",)
            fields = (
                "id",
                "title",
                "author",
                "author_data",
                "excerpt",
                "content",
                "status",
                "slug",
            )
            lookup_field = "slug"
    
        def get_author_data(self, obj):
            return PostAuthorSerializer(instance=obj.author).data
    

    然后您将能够使用 ID 写入 author,序列化的作者数据将在响应中以 author_data 的形式提供。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2015-03-20
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多