django - 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 可序列化的”
解决方案
您必须创建两个单独的序列化程序
一个用于检索。
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
推荐阅读
- c# - 删除word文档的行直到C#中的字符串
- java - Java 程序不会终止
- laravel - 添加闭包以选择原始查询(总和)
- php - 如果 foreach 内部有多个,则用分隔符打破
- ssl - 通过 haproxy 获取 MQTT 请求的客户端 IP
- python - 更改属性拼写后,Django“没有这样的列”
- c - 头文件如何使用数据结构而不包含任何其他文件
- angular - Angular - 如何在服务中模拟 HttpError 响应
- azure-functions - 应用程序功能:获得工作空间的身份验证?
- c# - Azure Maps - 渲染 - 获取地图图像 - 如何在默认模式下使用 pin 图像而不是标记图像作为 pin