很难找到这个帖子的好标题。 我用django,geodjango(postgis),django-rest-framework和rest_framework_gis开发web服务。这些网络服务将用于交互式地图。
我的一个模型如下:
class Polygon(models.Model):
fk_owner = models.ForeignKey(User, on_delete=models.DO_NOTHING) # the owner of this polygon (User)
external_id = models.CharField(max_length=25) # id in data warehouse
func_type = models.CharField(max_length=15) # e.g 'field', 'building', ...
coordinates = models.PolygonField()
properties = JSONField(default={}) # JSON containing attributes and actions
此型号的序列化器:
class PolygonSerializer(GeoFeatureModelSerializer):
class Meta:
model = Polygon
geo_field = "coordinates"
fields = ('external_id', 'fk_owner', 'func_type', 'properties')
终点
class FieldList(generics.ListCreateAPIView):
serializer_class = PolygonSerializer
lookup_field = 'external_id'
lookup_url_kwarg = 'external_id_field'
def get_queryset(self):
id_user = User.objects.get(external_id=self.kwargs['external_id_user']).id
queryset = Polygon.objects.filter(func_type="field").filter(fk_owner=id_user).all()
return queryset
def perform_create(self, serializer):
user = User.objects.get(external_id=self.kwargs['external_id_user'])
serializer.save(fk_owner=user)
当我使用以下curl请求时:
curl -X POST http://xxx.yyy.zzz/api/v2/users/aZ523AsZm/fields/ -d '{"external_id": "aE15feg64AzaP", "func_type": "field", "coordinates": "POLYGON((62780.8532226825 5415035.177460473, 62941.3759284064 5415283.89540161, 63187.058044587146 5415364.391565912, 63257.96856022246 5414992.852982632, 62780.8532226825 5415035.177460473, 62780.8532226825 5415035.177460473))", "properties": {"a": "b"}}' -H "Content-Type: application/json"
我得到{"fk_owner":["This field is required."],"external_id":["This field is required."],"coordinates":["This field is required."],"func_type":["This field is required."]}
但是,当我用简单的ModelSerializer替换GeoFeatureModelSerializer时,eveything很好。为什么?
我花了1个小时才找到了有罪的人,很快就结束了我的日常工作。任何帮助将不胜感激!谢谢,很抱歉这篇长篇文章。
[编辑10/11] :我的解决方法是使用2个序列化程序:一个用于GET,一个用于CREATE class PolygonList(generics.ListCreateAPIView): queryset = Point.objects.all() filter_backends =(drfg_filters.InBBoxFilter,)
def get_serializer_class(self):
if self.request.method == 'POST':
self.serializer_class = PolygonSerializerCreate
if self.request.method == 'GET':
self.serializer_class = PolygonSerializerRetrieve
return self.serializer_class
答案 0 :(得分:0)
django-rest-framework-gis repo包含一些创建新对象的POST请求示例,例如看一下这个:
正如您所看到的,POSTing应该可以正常工作,如果没有,它可能是一个错误,或者您使用的代码是错误的。
根据您在问题中发布的内容,您使用的JSON格式看起来不对。你告诉我你试图在POST请求中发送GeoJSON,但是我请你仔细看看我刚发布的链接然后再试一次。如果您认为这是一个错误,我们应该测试并修复它。
费德里科