不可散列类型:'OrderedDict'
unhashable type: 'OrderedDict'
当我尝试在 Postman 中执行 PUT 请求时,我在 Django 中遇到问题。
我怀疑问题是因为我的模型中嵌套了序列化器 class,但我不确定。
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
知道是什么导致了这个问题吗?
问题是经过验证的数据将 train_statistics
变成 OrderedDict
(使用嵌套序列化程序总是有点棘手),所以 OrderedDicts
是不可散列的,所以当你尝试到 ".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})
当我尝试在 Postman 中执行 PUT 请求时,我在 Django 中遇到问题。
我怀疑问题是因为我的模型中嵌套了序列化器 class,但我不确定。
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
知道是什么导致了这个问题吗?
问题是经过验证的数据将 train_statistics
变成 OrderedDict
(使用嵌套序列化程序总是有点棘手),所以 OrderedDicts
是不可散列的,所以当你尝试到 ".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})