【发布时间】:2019-02-19 18:25:03
【问题描述】:
我正在使用 Django 2.1、DRF 3.7.7。
我有一些模型及其相关(模型)序列化程序:这些模型是嵌套的,序列化程序也是如此。
举个例子吧:
# models.py
class City(models.Model):
name = models.CharField(max_length=50)
class Person(models.Model):
surname = models.CharField(max_length=30)
birth_place = models.ForeignKey(City)
# serializers.py
class CitySerializer(serializers.ModelSerializer):
class Meta:
model = models.CitySerializer
fields = "__all__"
class PersonSerializer(serializers.ModelSerializer):
birth_place = CitySerializer()
class Meta:
model = models.Person
fields = "__all__"
如果我提交带有 json 的 AJAX 请求,例如:{'surname': 'smith', 'birth_place': 42}
我收到了Bad Request 回复,其中包含:Invalid data. Expected a dictionary, but got int.
如果我提交嵌套的 json,例如:{'surname': 'smith', 'birth_place': {'id': 42, 'name': 'Toronto'}}
关系没有被转换,id 字段被忽略,其余的被解析为:OrderedDict([('birth_place', OrderedDict([('name', 'Toronto')]))])
以下是我在基于类的视图上使用的 post 方法:
def post(self, request):
print("Original data:", request.data)
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
self.data = serializer.validated_data
print("Parsed data:", self.data)
...
我只需要从连接到序列化器的端点获取数据,我不需要通过 REST 接口写入/保存任何东西,因为表单的 POST 处理是由 Django 完成的.
TL;DR:我应该如何正确地将 JSON 请求提交到嵌套序列化程序,而无需编写手工转换?我是否在设置序列化程序时犯了错误?
编辑:我发现通过将 id = serializers.IntegerField() 添加到序列化器父类(例如 City),序列化器解析器现在可以处理 id。至少现在我可以使用 django 在后端执行操作了。
【问题讨论】:
标签: django django-rest-framework