Django rest framework Django rest框架从id更新外键
是否可以按主键更新字段 序列化程序:Django rest framework Django rest框架从id更新外键,django-rest-framework,Django Rest Framework,是否可以按主键更新字段 序列化程序: class HuntingDetailViewSerializer(serializers.ModelSerializer): species = HuntingSpeciesSerializer(many=True, read_only=True) technique = HuntingTechniqueTagSerializer() class Meta: model = HuntListing
class HuntingDetailViewSerializer(serializers.ModelSerializer):
species = HuntingSpeciesSerializer(many=True, read_only=True)
technique = HuntingTechniqueTagSerializer()
class Meta:
model = HuntListing
exclude = ('owner',)
观点:
listing_id = request.data.get('listing_id')
listing = HuntListing.objects.get(id=listing_id)
serializer = HuntingDetailViewSerializer(listing, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
样本数据:
{"listing_id":9, "technique":1, ....}
但我得到了:
{'technique': {u'non_field_errors': [u'Invalid data. Expected a dictionary, but got int.']}}
如果重写更新并将此参数更改为技术_id,我在验证数据中看不到:
def update(self, instance, validated_data):
print(validated_data)
问题在于
technology=HuntingTechniqueTagSerializer()
。这将创建一个嵌套的序列化程序,因此当您尝试更新模型时,它需要一个嵌套的字典。如果你只是删除这一行,它应该工作。但是,如果需要嵌套视图,则必须创建单独的读/写序列化程序。只需覆盖到\u表示
就你而言:
class HuntingDetailViewSerializer(serializers.ModelSerializer):
species = HuntingSpeciesSerializer(many=True, read_only=True)
class Meta:
model = HuntListing
exclude = ('owner',)
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['technique'] = HuntingTechniqueTagSerializer(instance.technique).data
return ret
现在您可以在GET调用中看到obj,并且可以通过id更新/创建
{“清单id”:9,“技术”:1,…}谢谢!现在,我完全理解了如何实现这一点(在保持嵌套视图的同时使用pk更新记录)?