现在我有以下序列化器:
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
GET
个Shift
对象时是否可以包含整个POST
对象,但在Shift
创建新的pts = [Point(*tokarr) for tokarr in toks]
对象时仍然只接受一个整数?
答案 0 :(得分:1)
要获取员工的只读表示,您可以添加SerializerMethodField
。这将使employee
和POST
请求的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