0

이 스레드에 대한 좋은 제목을 찾기가 어려웠습니다. 나는 django, geodjango (postgis), django-rest-framework 및 rest_framework_gis로 웹 서비스를 개발 중이다. 이러한 웹 서비스는 대화식 맵에서 사용됩니다. 내 모델의GeoFeatureModelSerializer 및 ListCreateAPIView가있는 POST 요청에 필드가 필요합니다.

하나는 다음

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 -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" 

은 내가 간단한 ModelSerializer에 의해 GeoFeatureModelSerializer를 교체 할 때, eveything가 괜찮습니다, 그러나

{"fk_owner":["This field is required."],"external_id":["This field is required."],"coordinates":["This field is required."],"func_type":["This field is required."]}를 얻을. 왜 ?

죄책감을 찾기 위해 1 시간이 걸렸습니다. 곧 나에게는 하루 종일 끝났습니다. 어떤 도움을 주셔서 감사합니다! 감사와 긴 게시물에 대해 유감스럽게 생각합니다.

[EDIT 10/11] : 클래스를 만들 PolygonList 대한 GET 하나 하나 (generics.ListCreateAPIView) : 제 2 개 직렬 대안 사용하는 의 검색어 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

는 정상 JSON 대신 POST에 GeoJSON를 보내는 시도? – nemesisdesign

+0

예, 여전히 동일한 오류 메시지가 표시됩니다. – GwydionFR

+0

실패한 단위 테스트를 작성하고 리포에 풀 요청을 보낼 수 있습니까? 문제를 해결할 수있는 버그 일 경우 코드가 올바르지 않으면 문제를 디버그하는 데 도움이 될 수 있습니다. – nemesisdesign

답변

0

django-rest-framework-gis의 repo는, 새로운 객체를 생성 할 수있는 POST 요청의 몇 가지 예를 들어 있습니다

당신이 볼 수 있듯이, 게시 그것을하지 않는 경우, 그것은 버그 사용하는 코드가 잘못 중 하나입니다, 작업을해야

  • serializer code
  • unit test code
  • view code.

    질문에 게시 한 내용에서 사용중인 JSON 형식이 옳지 않은 것처럼 보입니다. POST 요청에서 GeoJSON을 보내려고했다고 말했지만 방금 게시 한 링크를주의 깊게 살펴보고 다시 시도해보십시오. 버그라고 생각되면 테스트하여 수정해야합니다.

    페데리코

  • +1

    안녕하세요, 다음 주에 다른 프로젝트를 진행할 예정이지만 다음 개발자에게 살펴 보도록하겠습니다. 나는 실수했다고 생각하지만 지금은 조사 할 시간이 없다.팁 주셔서 감사합니다. – GwydionFR