0

このスレッドの良いタイトルを見つけるのは難しいです。 私はdjango、geodjango(postgis)、django-rest-frameworkおよびrest_framework_gisを使用してWebサービスを開発しています。これらのWebサービスはインタラクティブマップで使用されます。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]:GET用と クラスPolygonList(generics.ListCreateAPIView)を作成するための1つ:私の回避策は2つのシリアライザを使用することである クエリセット= Point.objects.all() filter_backends =この1を見てみましょう(たとえば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レポは、新しいオブジェクトを作成するためのPOSTリクエストの例をいくつか含まれています

あなたが見ることができるように、投稿がそうでないならば、それはバグや使用しているコードが間違っているのどちらかですが、動作するはず

  • serializer code
  • unit test code
  • view code

    質問に投稿した内容から、使用しているJSON形式が正しくないようです。 POSTリクエストでGeoJSONを送信しようとしたとおっしゃいましたが、投稿したリンクを注意深く見て、もう一度試してください。それがバグだと思えば、テストして修正する必要があります。

    フェデリコ

  • +1

    こんにちは、来週別のプロジェクトに進出しますが、次の開発者に見せてもらいます。私はかなり間違いを犯したと確信していますが、今私は調査する時間がありません。あなたのヒントありがとう – GwydionFR

    関連する問題