假设您要在读取时显示嵌套数据。
还要假设您只允许更改外键的ID。
因此出现了以下定义,但是问题是它们使用相同的变量 "EMPLOYEES": {
"top_hits": {
"size": 2
// provider_a_id is in [.......] // list with 10K Ids
}
}
,并且在通过order_case
更新时得到了。
ValueError:无法分配“ 477”:必须“ OrderCaseRevision.order_case” 是“ OrderCase”实例。
{"order_case": 477}
我可以执行以下操作来缓解此问题,但是我不喜欢您通常使用外来键名称(如class OrderCaseRevisionSerializer(serializers.ModelSerializer):
order_case = OrderCaseSerializer(read_only=True)
order_case = serializers.IntegerField(write_only=True)
来更新外键字段,并且您在这里例外)使用order_case
。
order_case_id
答案 0 :(得分:1)
这是我解决此问题的方法。
定义自定义常规字段:
class MySelectField(serializers.PrimaryKeyRelatedField):
def __init__(self, **kwargs):
self.serializer_class = kwargs.pop('serializer_class', None)
super().__init__(**kwargs)
def to_representation(self, value):
obj = self.queryset.filter(pk=value.pk).first()
return self.serializer_class(obj).data
在序列化程序中使用它:
order_case = MySelectField(
queryset=OrderCase.objects.all(),
serializer_class=OrderCaseSerializer
)
您可以通过从序列化程序中提取queryset attr来进一步简化它,因此自定义字段仅具有序列化程序参数。