【问题标题】:How can I replace an object by its id in Django Rest Framework?如何在 Django Rest Framework 中用 id 替换对象?
【发布时间】:2016-05-03 12:24:49
【问题描述】:

我有这些序列化程序:

class ASerializer(serializers.ModelSerializer):
    name = serializers.CharField()

    class Meta:
        model = AModel
        fields = ('id','name')


class BSerializer(serializers.HyperlinkedModelSerializer):
    a = ASerializer(partial=True)
    name = serializers.CharField()

    class Meta:
        model = ‌‌BModel
        fields = ('id','name', 'a')


class CSerializer(serializers.HyperlinkedModelSerializer):
    b = BSerializer(partial=True)
    created_by = UserSerializer(required=False) 
    message = serializers.CharField()

    class Meta:
        model = CModel
        fields = ('id','b', 'created_by', 'message')

以下是数据,我发送给服务:

data_json = {
    "id": '1',
    "b": '2',
    "created_by":'3',
    "message": 'Hello world'
}

我希望响应数据包含所有嵌套的完美对象,而不仅仅是嵌套对象的 ID。

如何将B 对象或created_by 对象替换为它们的ID 以创建C 对象?

【问题讨论】:

  • 尝试将字段更改为("id", "b__id", "created_by__id", "message")
  • 在创建 C 对象时,您还可以使用完整的对象 json 获取 id,例如 b['id']crearted_by['id']
  • 请尝试更好地解释您想要做什么。你想得到的data_json应该是什么样子的?
  • 我想获取包含在所有嵌套对象中的数据,而不仅仅是嵌套对象 id。 @ozren1983
  • 问题已更新

标签: python django rest django-rest-framework serialization


【解决方案1】:

试试这个例子,序列化器定义为:

class ASerializer(serializers.ModelSerializer):
    name = serializers.CharField()

    class Meta:
        model = A
        fields = ('id', 'name')


class BSerializer(serializers.HyperlinkedModelSerializer):
    name = serializers.CharField()
    a = ASerializer(partial=True, many=True)

    class Meta:
        model = B
        fields = ('id', 'name', 'a')


class CSerializer(serializers.HyperlinkedModelSerializer):
    name = serializers.CharField()
    b = BSerializer(partial=True, many=True)

    class Meta:
        model = C
        fields = ('id', 'name', 'b')

而viewset定义为:

class CViewSet(viewsets.ModelViewSet):
    queryset = C.objects.all()
    serializer_class = CSerializer

这是上述视图集返回的 json 示例:

{
    "id": 2,
    "name": "c2",
    "b": [
        {
            "id": 2,
            "name": "b2",
            "a": [
                {
                    "id": 2,
                    "name": "a2"
                },
                {
                    "id": 3,
                    "name": "a3"
                }
            ]
        },
        {
            "id": 3,
            "name": "b3",
            "a": [
                {
                    "id": 3,
                    "name": "a3"
                }
            ]
        }
    ]
},

【讨论】:

  • 不,伙计,不适用于带有b 对象 id 的 POST 请求
  • 顺便说一下,b 不是对象列表。 b 是一个对象,我需要用 id 替换它:)
猜你喜欢
  • 2016-07-27
  • 2018-09-13
  • 2014-12-14
  • 2019-02-09
  • 2017-03-12
  • 2013-09-19
  • 1970-01-01
  • 2015-03-15
  • 2014-10-16
相关资源
最近更新 更多