创建时为PrimaryKeyField,获取时为SerialzerField

我有两个模型。员工和经理。创建员工时,应提供经理的ID(您永远都不能创建新员工),并且响应中应包含经理对象。这是代码

class ManagerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Manager
        fields = ('id','name')

class EmployeeSerializer(serializers.ModelSerialzier):
    manager = ManagerSerializer(required=False)

    class Meta:
        model = Employee

现在,它希望发送一个Manager对象,该对象创建一个新的manager,但这是一个仅ID字段。创建后,响应应如下所示:

{
    "id": 90,"manager": {
        "id": 26,"name": "John"
    }
    ...
}

以下引发异常:

POST /employees/

{
    "manager": 10,...
}
zhuzhuxiangw 回答:创建时为PrimaryKeyField,获取时为SerialzerField

您可以通过多种选择来实现这一目标:

  1. 序列化程序中的不同字段
  2. 用于输入和输出的不同串行器

我的个人喜好是2。

示例:

在序列化程序中使用不同的字段

这需要在您的cleint端进行一些更改。基本上,在创建新员工时,您将manager用作只读字段以用于外出,将manager_id用作write_only字段

    class EmployeeSerializer(serializers.ModelSerialzier):
        manager = ManagerSerializer(required=False,read_only=True)
        manager_id = serializers.PrimaryKeyRelatedField(required=False,allow_null=True,write_only=True,queryset=Manager.objects.all())                                                                                                     
        class Meta:
            model = Employee
            Fields = ( “manager”,“manager_id”,)

        def validate_manager_id(self,val):
            """ we need to do this because manager_id expects,well,id and not manager object"""
            return val.id if val is not None else None

使用不同的序列化器

您可以为输入创建串行器,为输出创建另一个。并且在您视图的get_serializer_class中,您将根据方法(GET / POST)返回正确的答案。

在这种情况下,您可以使用相同的字段名称manager,但是在一个序列化程序中,它是ManagerSerializer,在另一个序列化程序中,它可以是PrimaryKeyRelatedField(因此它仅接受管理器id)。

本文链接:https://www.f2er.com/3155909.html

大家都在问