Django Rest框架-为关系嵌套序列化程序编写

Django Rest框架-为关系嵌套序列化程序编写,django,rest,serialization,django-rest-framework,Django,Rest,Serialization,Django Rest Framework,我是一个新的DRF,所以我事先为任何错误感到抱歉 例如,我有一个Post模型,它将Author作为NewUser模型的外键。当我列出文章时,我不想得到author的主键,而是想得到带有author详细信息的嵌套对象,这就是为什么我创建了这样的序列化程序 class PostAuthorSerializer(serializers.ModelSerializer): class Meta: model = NewUser fields = ["id

我是一个新的DRF,所以我事先为任何错误感到抱歉

例如,我有一个Post模型,它将Author作为NewUser模型的外键。当我列出文章时,我不想得到author的主键,而是想得到带有author详细信息的嵌套对象,这就是为什么我创建了这样的序列化程序

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"
然而,现在我不知道如何回复帖子。我搜索了2天,但找不到一个合适的指南来了解如何做。我的主要目标是学习/理解而不是解决这个问题,所以一点解释也不错!我真的很想学习DRF,但我认为它缺乏详细的文档和互联网上的例子,或者至少我找不到我问题的答案

因此,我想学习两种发帖方式:

  • 表示仍保持这种方式,但我仍然/发布了一篇显示“author”:id的帖子
  • 代理保持这种方式,我/发布“作者:{”电子邮件“:”orkhan@test.com,“user_name”:“orkan.test”},并且在获得author对象后仍然可以创建我的帖子

  • 提前谢谢

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

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

    class PostAuthorSerializer(serializers.ModelSerializer):
    类元:
    model=NewUser
    字段=[“id”、“电子邮件”、“用户名”]
    类后序列化程序(serializers.ModelSerializer):
    author\u data=serializers.SerializerMethodField()
    类元:
    型号=员额
    只读字段=(“slug”,)
    字段=(
    “身份证”,
    “头衔”,
    “作者”,
    “作者数据”,
    “摘录”,
    “内容”,
    “地位”,
    “鼻涕虫”,
    )
    查找\u field=“slug”
    def获取作者数据(自身、obj):
    返回PostAuthorSerializer(实例=obj.author).data
    

    然后,您将能够使用ID编写
    author
    ,并且序列化的作者数据将作为响应中的
    author\u data
    提供。

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

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

    class PostAuthorSerializer(serializers.ModelSerializer):
    类元:
    model=NewUser
    字段=[“id”、“电子邮件”、“用户名”]
    类后序列化程序(serializers.ModelSerializer):
    author\u data=serializers.SerializerMethodField()
    类元:
    型号=员额
    只读字段=(“slug”,)
    字段=(
    “身份证”,
    “头衔”,
    “作者”,
    “作者数据”,
    “摘录”,
    “内容”,
    “地位”,
    “鼻涕虫”,
    )
    查找\u field=“slug”
    def获取作者数据(自身、obj):
    返回PostAuthorSerializer(实例=obj.author).data
    
    然后您将能够使用ID编写
    author
    ,并且序列化的author数据将作为
    author\u data
    在响应中可用