Python Django嵌套对象,不同的序列化程序获取和发布

Python Django嵌套对象,不同的序列化程序获取和发布,python,django,serialization,nested,Python,Django,Serialization,Nested,这是我这个问题的后续问题 现在,我可以使用用户主键发布一个新的AP对象,并在AP序列化程序user=UserIndexSerializer()中注释这一行之后: 邮递员要求: { “用户”:1, “名称”:“最大AP 05” } 然而,我现在遇到的问题是,初始UserIdexSerializer变得无用 此序列化程序确定要在GET请求中显示的字段,但结果是在POST请求中强制使用所需的字段。 我想做的是: 仅使用用户ID发布新AP对象 在GET请求期间显示UserIndexSerialize

这是我这个问题的后续问题

现在,我可以使用用户主键发布一个新的AP对象,并在AP序列化程序
user=UserIndexSerializer()
中注释这一行之后:

邮递员要求:

{
“用户”:1,
“名称”:“最大AP 05”
}
然而,我现在遇到的问题是,初始UserIdexSerializer变得无用

此序列化程序确定要在GET请求中显示的字段,但结果是在POST请求中强制使用所需的字段。 我想做的是:

  • 仅使用用户ID发布新AP对象
  • 在GET请求期间显示UserIndexSerializer字段(名字, 姓氏,但不是ID)
我怎样才能做到这一点

我发现并阅读了这篇文章

我尝试使用不同的视图,一个用于列出我的模型,另一个用于创建新模型:

从rest\u框架导入序列化程序
来自..models.model\u art\u工件导入AP
从.serializers\u用户导入*
类APIndexSerializer(serializers.ModelSerializer):
user=UserIndexSerializer()
类元:
型号=AP
字段=[
“id”,
“用户”,
“姓名”
]
类APCreateSerializer(serializers.ModelSerializer):
user=UserIDSerializer()
类元:
型号=AP
字段=[
“id”,
“用户”,
“姓名”
]
def创建(自我验证的_数据):
ap=ap.objects.create(**已验证的_数据)
返回ap
类APDetailsSerializer(serializers.ModelSerializer):
类元:
型号=AP
字段='\uuuu所有\uuuu'
我还尝试创建不同的序列化程序:

从rest\u框架导入序列化程序
from..models.model\u用户导入用户
类UserIndexSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段=[
“名字”,
“姓”
]
类UserIDSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段=[
“身份证”
]
类UserDetailsSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段='\uuuu所有\uuuu'

这根本不起作用,有人能帮我吗?

我将给你一个例子来解释如何在GET/POST中为关系字段使用不同的序列化程序

有一个票证模型,它有一个外键引用用户模型。在创建票证的帖子中,您需要用户id来创建对象。在GET-to-GET票证的详细信息中,您希望显示用户的详细信息,而不是ID

Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
然后,在序列化程序文件中

class UserDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name')


class TicketPostSerializer(serializer.ModelSerializer):
    class Meta:
        model = Ticket
        fields = '__all__'


class TicketDetailSerializer(serializer.ModelSerializer):
    user = UserDetailSerializer(read_only=True)
    class Meta:
        model = Ticket
        fields = '__all__'

然后,在票证的查看功能中,您有:

class TicketViewSet(viewsets.ModelViewSet):
    serializer_class = TicketPostSerializer
    def get_serializer_class(self):
        if self.action in ['list', 'retrieve']:
            return TicketDetailSerializer

一切就绪,您就可以开始了。

我将给您一个示例来解释如何在GET/POST中为关系字段使用不同的序列化程序

有一个票证模型,它有一个外键引用用户模型。在创建票证的帖子中,您需要用户id来创建对象。在GET-to-GET票证的详细信息中,您希望显示用户的详细信息,而不是ID

Ticket(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
然后,在序列化程序文件中

class UserDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name')


class TicketPostSerializer(serializer.ModelSerializer):
    class Meta:
        model = Ticket
        fields = '__all__'


class TicketDetailSerializer(serializer.ModelSerializer):
    user = UserDetailSerializer(read_only=True)
    class Meta:
        model = Ticket
        fields = '__all__'

然后,在票证的查看功能中,您有:

class TicketViewSet(viewsets.ModelViewSet):
    serializer_class = TicketPostSerializer
    def get_serializer_class(self):
        if self.action in ['list', 'retrieve']:
            return TicketDetailSerializer

一切就绪,您可以自由移动。

如果我理解正确,您希望的是在获取过程中获取嵌套对象。我在序列化程序中解决了相同的问题

class APIndexSerializer(serializers.ModelSerializer):
    class Meta:
        model = AP
        fields = ['id','user','name']

    def to_representation(self, obj):
        self.fields['user'] = UserIndexSerializer()
        return super(APIndexSerializer, self).to_representation(obj)

您可以使用此命令创建id,并获取用户的嵌套信息

如果我理解正确,那么您想要的是在get期间获取嵌套对象。我在序列化程序中解决了相同的问题

class APIndexSerializer(serializers.ModelSerializer):
    class Meta:
        model = AP
        fields = ['id','user','name']

    def to_representation(self, obj):
        self.fields['user'] = UserIndexSerializer()
        return super(APIndexSerializer, self).to_representation(obj)

您可以使用此命令创建id,并获取用户的嵌套信息

我知道你在@JunZhou做了什么,但是当我尝试它时,它给了我错误
'AP'对象没有属性'action'
我知道你在@JunZhou做了什么,但是当我尝试它时,它给了我错误
'AP'对象没有属性'action'
只是为了更好地理解to_表示方法的返回。obj是否在to_表示法(obj)中传递给使用super()函数创建的对象,该函数继承自序列化程序和当前正在处理的AP实例?只是为了更好地理解to_表示法的返回。obj是否在to_表示(obj)中传递给使用super()函数创建的对象,并从序列化程序和正在处理的当前AP实例继承?