所以我正在使用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模型使用值作为十进制字段,传感器作为外键,并指向另一个外键。我正在使用选择字段来获取已创建的对象,但是从create函数中,我得到一个TypeError,说明(传感器对象)不是JSON可序列化的。我认为同样的事情正在发生,但我不确定该怎么做。任何帮助将不胜感激!
答案 0 :(得分:0)
根据to选项有效值列表或(key,display_name)元组列表。从Sensor和MapPoint对象或元组(字段,display_name)指定字段:
list(Sensor.objects.values_list('id').all())
或者,例如(如果您的模型有名称字段)
list(Sensor.objects.values_list('id', 'name').all())
答案 1 :(得分:0)
这里的主要问题是你传递DataPoint类是create function而不是DataPoint对象的结果。这就是错误的含义。此外,sensor
和point
是主键。因此,您可以在PrimaryKeyRelatedField
中使用serializer
。
试试这个
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)
注意:由于您使用的是模型序列化程序,因此无需为fields
或create
函数指定update
或编写定义。模型序列化器本身从模型中查找字段,它应包含简单创建和更新函数的定义。您可以看到详细信息here。考虑到这些,您的DataPointSerializer可以最小化到
class DataPointSerializer(serializers.ModelSerializer):
class Meta:
model = DataPoint
fields = "__all__"