使用其他请求参数在DRF 3

时间:2017-01-12 11:16:09

标签: django django-rest-framework

我是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也会出现相同的错误。
这有什么不对?
如何为给定的型号和要求构建串行器?

1 个答案:

答案 0 :(得分:1)

您认为序列化工具如何了解latitutelongitute字段的用途? 您应该覆盖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,它为地理位置提供字段和小部件。