【问题标题】:Field is required on POST requets with GeoFeatureModelSerializer and ListCreateAPIView使用 Geo Feature ModelSerializer 和 ListCreateAPIView 的 POST 请求需要字段
【发布时间】:2017-02-19 00:17:22
【问题描述】:

很难为这个线程找到一个好的标题。 我正在使用 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 时,一切都很好。为什么?

我花了大约 1 个小时才找到有罪的人,我的一天工作很快就结束了。任何帮助将不胜感激!谢谢,很抱歉发了这么长的帖子。

[EDIT 10/11]:我的解决方法是使用 2 个序列化程序:一个用于 GET,一个用于 CREATE 类 PolygonList(generics.ListCreateAPIView): 查询集 = 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

【问题讨论】:

  • 您是否尝试过在 POST 中发送 GeoJSON 而不是普通的 JSON?
  • 是的,它仍然是同样的错误信息
  • 你能写一个失败的单元测试并向repo发送一个拉取请求吗?如果是错误我可以修复它,如果代码不正确我可以帮助您调试问题。

标签: django django-rest-framework postgis geodjango django-rest-framework-gis


【解决方案1】:

django-rest-framework-gis 存储库包含一些用于创建新对象的 POST 请求示例,例如看看这个:

如您所见,POST 应该可以正常工作,如果不能正常工作,则可能是错误或您使用的代码有误。

从您在问题中发布的内容来看,您使用的 JSON 格式似乎不正确。您告诉我您尝试在 POST 请求中发送 GeoJSON,但我要求您仔细查看我刚刚发布的链接,然后再试一次。如果您认为这是一个错误,我们应该对其进行测试并修复它。

费德里科

【讨论】:

  • 您好,下周我会继续另一个项目,但我会通知下一位开发人员看看。我很确定我犯了一个错误,但现在我没有时间调查。感谢您的提示
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 2021-02-07
  • 2020-11-21
  • 2011-11-11
  • 2020-11-03
  • 1970-01-01
  • 2014-08-09
  • 2018-07-12
相关资源
最近更新 更多