[英]Django Rest Framework ModelSerializer custom serializer field to_internal_value doesn't save to object
[英]Django rest framework, serializer method field doesn't save changes to db?
我有一个 DRF API 包含在序列化程序中设置的字段:
class KnownLocation(models.Model):
latitude = models.FloatField(name="Latitude",
verbose_name='Latitude',
unique=True, max_length=255, blank=False,
help_text="Enter the location's Latitude, first when extracting from Google Maps.",
)
longitude = models.FloatField(name="Longitude",
verbose_name="Longitude",
unique=True, max_length=255, blank=False,
help_text="Enter the location's Longitude, second when extracting from Google Maps.",
)
elevation = models.FloatField(name="elevation",
help_text="Enter the location's ~Sea Level~ elevation, or Leave empty for auto-fill "
"by me :). ",
verbose_name="Elevation in meters",
blank=True,
default=DEFAULT_VALUE
)
和序列化器:
class KnownLocationSerializer(HyperlinkedModelSerializer):
date_added = DateTimeField(format="%d-%m-%Y", required=False, read_only=True)
elevation = SerializerMethodField()
def validate_elevation(self, value):
"""
Validate that elevation of location has been updated already.
"""
if value is None or 1:
raise APIException.elevation.throw()
return value
def get_elevation(self, obj):
"""
This method, which is connected to SerializerMethodField, checks if the object's elevation value exists,
if not, it fetches it.
"""
elevation = obj.elevation
if elevation is None or 1:
elevation = get_elevation(lat=obj.Latitude, lon=obj.Longitude)
elevation = round(elevation)
return elevation
pass
该方法有效并获取海拔高度,但它不会将其保存到数据库中。 我错过了文档中的那部分吗? 那么,如何将其保存到数据库中,使用 save 对我不起作用:
def save(self, **kwargs):
latitude, longitude = self.instance.latitude, self.instance.longitude
self.instance.elevation = get_elevation(latitude, longitude)
self.instance.save()
return self.instance
def validate_elevation(self, value):
"""
Validate that elevation of location has been updated already.
"""
if value is None or 1:
raise APIException.elevation.throw()
return value
文档对此很清楚 - SerializerMethodField
是只读的。
我认为您需要的是自定义字段。 Django Rest Framework 如何更新 SerializerMethodField是一个很好的起点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.