Serializer需要在GET中包含更多信息,同时接受POST中的原语

时间:2015-06-03 05:09:17

标签: django django-rest-framework

现在我有以下序列化器:

class ShiftSerializer(serializers.ModelSerializer):
    confirmed_location = LocationSerializer(required=False)

    class Meta:
        model = Shift

当我创建一个新的Shift对象时,我可以传递像这样的基本对象......

{date_requested: "2015-06-11", employee: 4, shift_requested: 2}

...并且对象的创建没有问题。

为了使Shift个对象更加冗长,我们为Employee字段声明了一个Serializer,以便我的GET包含有关该员工的信息:

class ShiftSerializer(serializers.ModelSerializer):
    confirmed_location = LocationSerializer(required=False)
    employee = EmployeeSerializer(required=False)

    class Meta:
        model = Shift

这产生了预期的效果:现在我可以看到谁请求了转换,而没有对每个用户进行第二次查询。不幸的是,在我这样做之后,每当我尝试POST同一个对象来创建一个新的Shift时,我就开始收到HTTP 400错误:

  

无效数据。期待一本字典,但得到了int。

我很肯定EmployeeSerializer吓坏了,因为我没有传递整个Employee对象,只有id指向特定的Employee。在Employee GETShift对象时是否可以包含整个POST对象,但在Shift创建新的pts = [Point(*tokarr) for tokarr in toks] 对象时仍然只接受一个整数?

1 个答案:

答案 0 :(得分:1)

要获取员工的只读表示,您可以添加SerializerMethodField。这将使employeePOST请求的PUT字段保持不变,并在employee_data添加序列化表示。

class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee

class ShiftSerializer(serializers.ModelSerializer):
    confirmed_location = LocationSerializer(required=False)

    # this will look for a method named get_employee_data
    employee_data = serializers.SerializerMethodField()

    class Meta:
        model = Shift
        fields = (
            'confirmed_location', 
            'date_requested', 
            'shift_requested',
            'employee',
            'employee_data',
        )

    def get_employee_data(self, obj):
        """ Returns serialized representation of an employee.
        """
        return EmployeeSerializer(obj.employee).data