我有一个Django代码库,它使用Django Rest Framework (DRF)作为API,该API将数据库的内容提供给前端。
我现在还希望用户能够通过此API发布新内容。我有可以接受POST的API,但是遇到gis Pointfield问题。
在我的一个模型中,我具有以下字段:
from django.contrib.gis.db import models as gis_models
class Device(models.Model):
geometry = gis_models.PointField(name='geometry',null=True,blank=True)
# And some other fields
我让人们在两个单独的字段(latitude
和longitude
)中发布几何图形,然后将其写入geometry
字段中。我有一个如下所示的DeviceSerializer:
类DeviceSerializer(HALSerializer): 类型= TypeSerializer(很多=真) 经度= serializers.SerializerMethodField() 纬度= serializers.SerializerMethodField() 组织= serializers.SerializerMethodField()
class Meta:
model = Device
fields = (
'_links','id','types','longitude','latitude','organisation'
)
def get_organisation(self,obj):
if obj.owner:
return obj.owner.organisation
return 'Unknown'
def get_longitude(self,obj):
if obj.geometry:
return obj.geometry.x
def get_latitude(self,obj):
if obj.geometry:
return obj.geometry.y
def create(self,validated_data):
print(validated_data) # IN HERE I DON'T RECEIVE THE POSTED LATITUDE AND LONGITUDE
types_data = validated_data.pop('types')
device = Device.objects.create(**validated_data)
for type_data in types_data:
Type.objects.create(device=device,**type_data)
if 'longitude' in validated_data and 'latitude' in validated_data:
# WE NEVER REACH THIS POINT BECAUSE THE LAT AND LONG ARE NEVER POSTED
device.geometry = Point(validated_data.pop('longitude'),validated_data.pop('latitude'))
return device
然后在测试中,我这样做:
response = self.client.post(
url,data={'types': [],'latitude': 1,'longitude': 1,'organisation': 'abc'},format='json'
)
但是latitude
和longitude
从未出现在print(validated_data)
中。有人知道他们为什么在那里失踪吗?