首页 > 解决方案 > Django REST框架多对多错误

问题描述

当我为 ManyToMany 字段添加序列化程序时,它会在 REST API 上显示结果,但是当我发布数据时,序列化程序会将 is_valid() 设为 false。当我将它们称为 JSONFields 时,序列化程序 is_valid() 为 True 并且数据被保存,但是在查看 localhost 上的 api 时,它会给出以下错误 - 'ManyRelatedManager' 类型的对象不是 JSON 可序列化的'

class B(models.model):
    name = models.CharField()

class A(models.model):
    b = models.ManyToManyField(B)

class BSerializer(serializer.modelSerializer):
    class Meta:
        model=B
        fields = '__all__'

class ASerializer(serializer.ModelSerializer):
    b = BSerializer(many=true)

    def save(self):
        b_data = self.validated_data.pop('b')
        a = A.objects.create(**validated_data)
        b_instance = B.objects.get(name=b_data['name'])
        a.add(b_instance)

当使用http://localhost:8000/a/REST命中时,这在 REST 框架 UI 上提供了完美的结果,但是当我使用数据 {'b':[{'name':'foo'} 在邮递员上命中 POST 请求时]} 序列化程序无法使用 is_valid() 函数。

但是当我将代码更改为:

class ASerializer(serializer.ModelSerializer):
    b = serializer.JSONField()

    def save(self):
        b_data = self.validated_data.pop('b')
        a = A.objects.create(**validated_data)
        b_instance = B.objects.get(name=b_data['name'])
        a.add(b_instance)

邮递员命中保存了 A 的数据,然后将 b 实例添加到其中。当我在 python shell 中看到数据时可以看到。但是在 REST 框架 UI 上查看它时,它给出了以下错误:“'ManyRelatedManager' 类型的对象不是 JSON 可序列化的”

标签: djangopython-3.xdjango-rest-frameworkdjango-2.0

解决方案


您必须创建两个单独的序列化程序

一个用于检索。

class A_RetriveSerializer(serializer.ModelSerializer):
    b = BSerializer(many=true)

    class Meta:
       model = A
       fields = '__all__'

和其他用于创建对象。

class A_PostSerializer(serializer.ModelSerializer):
    b = serializer.JSONField()

    class Meta:
       model = A
       fields = ('b', )

    def save(self):
        b_data = self.validated_data.pop('b')
        a = A.objects.create(**validated_data)
        b_instance = B.objects.get(name=b_data['name'])
        a.b.add(b_instance)

并在您的视图中覆盖get_serializer_class方法

def get_serializer_class(self):
    if self.request.method == 'POST':
       return A_PostSerializer
    return A_RetriveSerializer

推荐阅读