【问题标题】:TypeError: manager_method() argument after ** must be a mapping, not strTypeError:**后的 manager_method() 参数必须是映射,而不是 str
【发布时间】:2021-01-23 01:04:12
【问题描述】:

抱歉,我是 django rest 框架的新手,遇到了一些麻烦。

我正在使用一个嵌套序列化程序,我想为其添加一个 create() 方法。

在尝试这样做时:我创建了以下 serializers.py:

class ASerializer(serializers.ModelSerializer):
    class Meta:
        model = A
        fields = (
            "id",
            "name",
        )


class BSerializer(serializers.ModelSerializer):
    class Meta:
        model = B
        fields = (
            "id",
            "name",
        )


class CSerializer(serializers.ModelSerializer):
    class Meta:
        model = C
        fields = (
            "id",
            "name",
        )

class NSerializer(serializers.ModelSerializer):
    a = ASerializer()
    b = BSerializer()
    c = CSerializer()

    class Meta:
        model = N
        fields = (
            "id",          
            "a",
            "b",               
            "c",
            "description",
        )

    def create(self, validated_data):
        a_data= validated_data.pop("a")
        b_data= validated_data.pop("b")
        c_data= validated_data.pop("c")
        n = N.objects.create(**validated_data)

        for one in a.data:
            A.objects.create(n=n, **one)

        for two in b.data:
            B.objects.create(n=n, **two)

        for three in c.data:
            C.objects.create(n=n, **three)

        return n

我希望能够对以下格式的数据执行 POST:

{
    "id": 1,
    "a": {
        "id": 1,
        "name": "apple"
    },
    "b": {
        "id": 5,
        "name": "red"
    },
    "c": {
        "id": 2,
        "name": "medium"
    },
    "description": "a description."
}

我的模型是通过外键链接的,我可以在没有我的 django 管理端点中的 create() 的情况下执行请求(将在此处发布我的 models.py,但代码对于一个问题来说已经相当大了)但我想知道为什么我收到以下错误:

TypeError: django.db.models.manager.BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method() argument after ** must be a mapping, not str

据我了解,鉴于我的管理员对我的序列化程序没有管辖权,因此我的管理员可以正常工作是有道理的。我相信这意味着错误就在我的 serializers.py 中。任何帮助将不胜感激,非常感谢!

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

    我认为您误解了您在验证数据中收到的内容。 validated_data 是一个映射(字典),其嵌套的序列化器键也是字典。我认为发生的事情是您试图使用字典键(字符串)创建一个对象,导致您收到错误。

    试试这个:

    A.objects.create(n=n, **a_data)
    

    可以在此处找到有关此确切案例的文档: https://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多