Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework Django rest框架从id更新外键_Django Rest Framework - Fatal编程技术网

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更新记录)?