2016-08-03 68 views
-1

我在Django遇到一个问题,当我尝试在Postman中执行PUT请求时。难以置信的类型:'OrderedDict'

我怀疑这个问题是因为我在模型类中嵌套了序列化器,但我不确定。

class Foo(models.Model): 
    foo_name = models.CharField(max_length=50, unique=True) 

    foo_statistics = models.ManyToManyField(TrainStatistics) 

class FooSerializer(serializers.ModelSerializer): 
    blah_statistics = BlahStatisticsSerializer(many=True) 

    class Meta: 
     model = Foo 
     fields = ('foo_statistics') 
     depth = 2 

    def create(self, validated_data): 
     """ 
     Create and return a new `Summary` instance, given the validated data. 
     """ 

     blah_statistics_data = validated_data.pop('blah_statistics') 
     foo = Foo(**validated_data) 

     for blah_statistic in blah_statistics_data: 
      FooStatistic.objects.create(summary=summary, **train_statistic) 
     return summary 

    def update(self, instance, validated_data): 
     """ 
     Update and return an existing `Foo` instance, given the validated data. 
     """ 
     instance.blah_statistics = validated_data.get('blah_statistics', instance.blah_statistics) # This line is causing problems 

任何想法可能会导致此问题?

+0

水落石出,并张贴在那里在你的代码发生错误的痕迹。 – levi

+1

切勿复制或链接错误图像,粘贴完整的回溯。 –

+0

用底部产生问题的行更新了问题 –

回答

2

的问题是,经过验证的数据变成train_statisticsOrderedDict(始终是有点棘手嵌套串行工作),所以OrderedDicts是unhashable,所以当你尝试“.get”它会引发错误。

一个选项是将字段train_statistics设置为只读。

然后在您的update()方法中,而不是使用validated_data来获得train_statistics,请使用request.data来获取它们。对create()方法做同样的操作。

class SummarySerializer(serializers.ModelSerializer): 
    train_statistics = TrainStatisticsSerializer(many=True, read_only=True) 

    class Meta: 
     model = Summary 
     fields = ('train_statistics') 
     depth = 2 

    def create(self, validated_data): 
     """ 
     Create and return a new `Summary` instance, given the validated data. 
     """ 
     request = self.context['request'] 
     train_statistics_data = request.data.get('train_statistics') 
     summary = Summary.objects.create(**validated_data) 

     for train_statistic in train_statistics_data: 
      TrainStatistics.objects.create(summary=summary, **train_statistic) 
     return summary 

    def update(self, instance, validated_data): 
     """ 
     Update and return an existing `Summary` instance, given the validated data. 
     """ 
     request = self.context['request'] 
     instance.train_statistics =request.data.get('train_statistics', instance.train_statistics) # This line is causing problems 

当您调用序列化程序时,需要传递请求对象作为上下文数据。

SummarySerializer(instance, data=data, context={'request':request}) 

SummarySerializer(data=data, context={'request':request}) 
+0

感谢您的答案。我在你的修改中添加了,它说我的'SummarySerializer'对象在update方法中没有属性'request'。我需要将它作为更新方法中的参数传入吗? –

+0

@MthetheLin对不起,我忘了,你需要通过它,我更新了我的答案。 – levi