DRF,外键关系的一致API

时间:2019-09-15 03:21:55

标签: django django-rest-framework

假设您要在读取时显示嵌套数据。
还要假设您只允许更改外键的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

1 个答案:

答案 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来进一步简化它,因此自定义字段仅具有序列化程序参数。