2016-08-03 4 views
-1

私はPostmanでPUTリクエストをしようとするとDjangoで問題が発生します。unhashableタイプ: '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

問題は(常にそれがネストされたシリアライザと協力少しトリッキーです)検証データがOrderedDicttrain_statisticsを回すということなので、OrderedDictsは非ハッシュなので、あなたが「.get」しようとすると、それはエラーが発生します。

オプションは、フィールドtrain_statisticsを読み取り専用に設定することです。

update()メソッドでは、を使用して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

@MatthewLin申し訳ありませんが、私はそれを渡す必要があります、私は私の答えを更新忘れてしまった。 – levi

関連する問題