所以我在一个使用 Django 的网站上工作,但在使用序列化程序时遇到了问题。这是代码:
class DataPointSerializer(serializers.ModelSerializer):
value = serializers.DecimalField(max_digits=30, decimal_places=15)
sensor = serializers.ChoiceField(choices=list(Sensor.objects.all()))
point = serializers.ChoiceField(choices=list(MapPoint.objects.all()))
class Meta:
model = DataPoint
fields = "__all__"
def create(self, attrs, instance=None):
return DataPoint(value=attrs['value'], sensor=attrs['sensor'], point=attrs['point'])
我的 DataPoint 模型使用值作为小数字段,传感器作为外键,点作为另一个外键。我正在使用选择字段来获取已创建的对象,但是从创建函数中,我得到一个 TypeError 说(传感器对象)不是 JSON 可序列化的。我假设同样的事情正在发生,但我不确定该怎么做。任何帮助将不胜感激!
最佳答案
这里的主要问题是您将 DataPoint 类作为创建函数的结果而不是 DataPoint 对象传递。这就是错误的意思。 sensor
和 point
也是主键。因此,您可以在 serializer
中使用 PrimaryKeyRelatedField
。
试试这个
class DataPointSerializer(serializers.ModelSerializer):
value = serializers.DecimalField(max_digits=30, decimal_places=15)
sensor = serializers.PrimaryKeyRelatedField(queryset=Sensor.objects.all())
point = serializers.PrimaryKeyRelatedField(queryset=MapPoint.objects.all())
class Meta:
model = DataPoint
fields = "__all__"
def create(self, validated_data, instance=None):
return DataPoint.objects.create(**validated_data)
注意:由于您使用的是模型序列化程序,因此您不需要指定字段
或为create
或 编写定义更新
函数。模型序列化器本身从模型中找到字段,它应该包含简单创建和更新函数的定义。可以看详情here .考虑到这些,您的 DataPointSerializer 可以最小化为
class DataPointSerializer(serializers.ModelSerializer):
class Meta:
model = DataPoint
fields = "__all__"
关于python - Django 序列化程序对象不是 JSON 可序列化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617116/