我有以下序列化器定义:
class TestSerializer(serializers.ModelSerializer):
contexts = serializers.SerializerMethodField()
class Meta:
model = Test
fields = (
"id",
"contexts"
)
def get_contexts(self, obj):
return ...
def create(self, data):
print('CREATE')
print(data)
return super().create(data)
def update(self, instance, validated_data):
print('UPDATE')
print(validated_data)
return super().update(instance, validated_data)
并在 View 集中使用此类
serializer_class = TestSerializer
queryset = Test.objects.all()
请注意,contexts
字段不是数据库字段。当使用 GET 访问端点时,我使用
{
"id": 1,
"contexts": [{...}]
}
但是当将相同的数据作为 POST 发送回来时,就会出现两个问题。第一个序列化器似乎无法关联正确的数据集,因为我总是在导致错误的 create
方法中结束
duplicate key value violates unique constraint
并且在创建方法中打印数据
时,上下文根本不存在。
最佳答案
假设您正在使用 ModelViewSet
并已在网址上注册它:/api/test/
...
诸如您所描述的请求之类的 POST
请求确实会尝试创建一个以 1
作为 id
的新条目。如果具有 id
1
的条目已存在,则这是不可能的。
要更新,您需要向详细路由发送 PATCH
请求。 /api/test/1/
编辑
SerializerMethodField
是只读的,不会显示在 validated_data
中。您可以在 self.context['request'].data.get('contexts')
中访问它。但我建议为该领域创建另一个序列化器......
class ContextsSerializer(serializers.Serializer):
class Meta:
fields = (...)
class TestSerializer(serializers.ModelSerializer):
contexts = ContextsSerializer(many=False)
如果您希望正确完成此操作,还有更多内容。如果不确切知道您要做什么以及为什么,我不想提出完整的解决方案。但您可以使用未经请求
验证的数据来完成您想要执行的操作。
关于python - Django Serializer POST 数据未完全传递给序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53223041/