我是Djnago Rest Framework 3的新手,无法理解如何实现这一目标:
我有以下模型:
class Interface(models.Model):
name = models.CharField(max_length=25)
current_location = models.CharField(max_length=25, blank=True)
在请求参数中,我期待纬度,经度字段,它将从纬度,经度生成 geohash 并存储在 current_location 中。
我尝试使用以下序列化程序和ViewSet,但它给出了错误
'Interface'对象没有属性'latitude'。
class InterfaceSerializer(serializers.ModelSerializer):
latitude = serializers.FloatField()
longitude = serializers.FloatField()
class Meta:
model = Interface
fields = ('id', 'name', 'latitude', 'longitude',)
read_only_fields = ('id',)
class InterfaceViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows interface to be viewed or edited.
"""
queryset = Interface.objects.all()
serializer_class = InterfaceSerializer
即使使用serializers.Serializer而不是serializers.ModelSerializer也会出现相同的错误。
这有什么不对?
如何为给定的型号和要求构建串行器?
答案 0 :(得分:1)
您认为序列化工具如何了解latitute
和longitute
字段的用途?
您应该覆盖create
方法并手动设置current_location
class InterfaceSerializer(serializers.ModelSerializer):
latitude = serializers.FloatField()
longitude = serializers.FloatField()
class Meta:
model = Interface
fields = ('id', 'name', 'latitude', 'longitude',)
def create(self, validated_data):
latitute = validated_data.get('latitude')
longitude = validated_data.get('longitude')
name = validated_data.get('name')
# suppose you want to store it charfield comma separated
current_location = str(latitute) + ',' + str(longtitute)
return Interface.objects.create(
current_location=current_location,
name=name
)
还有一个有用的包django-geoposition,它为地理位置提供字段和小部件。