0

Il était difficile de trouver un bon titre pour ce sujet. Je développe des webservices avec django, geodjango (postgis), django-rest-framework et rest_framework_gis. Ces webservices seront utilisés dans des cartes interactives.Champ requis pour les requêtes POST avec GeoFeatureModelSerializer et ListCreateAPIView

Un de mon modèle est le suivant:

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 

Le sérialiseur de ce modèle:

class PolygonSerializer(GeoFeatureModelSerializer): 
    class Meta: 
     model = Polygon 
     geo_field = "coordinates" 
     fields = ('external_id', 'fk_owner', 'func_type', 'properties') 

Et le point final

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) 

Lorsque j'utilise la demande boucle suivante:

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" 

Je reçois {"fk_owner":["This field is required."],"external_id":["This field is required."],"coordinates":["This field is required."],"func_type":["This field is required."]}

Cependant, quand je remplacerai GeoFeatureModelSerializer par une simple ModelSerializer, eveything est très bien. Pourquoi ?

Il m'a fallu 1 heure pour trouver les coupables, et c'est bientôt la fin de la journée pour moi. Toute aide serait appréciée! Merci, et désolé pour le long post.

[EDIT 10/11]: Ma solution consiste à utiliser 2 serializers: un pour GET et un pour CREATE classe 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

Avez-vous essayé d'envoyer GeoJSON dans le POST au lieu du JSON normal? – nemesisdesign

+0

Oui, et toujours le même message d'erreur – GwydionFR

+0

Pourriez-vous écrire un test d'unité défaillant et envoyer une demande d'extraction au référentiel? Si c'est un bogue, je peux le réparer, si le code n'est pas correct je peux vous aider à déboguer le problème. – nemesisdesign

Répondre

0

Le repo django-rest-framework-gis contient quelques exemples d'une requête POST pour créer de nouveaux objets, par exemple jeter un oeil à celui-ci:

Comme vous pouvez le voir, afficherons devrait fonctionner, si elle ne le fait pas, il est soit un bug ou le code que vous utilisez est erroné. De ce que vous avez posté dans votre question, il semble que le format JSON que vous utilisez n'est pas correct. Vous m'avez dit que vous aviez essayé d'envoyer GeoJSON dans la requête POST, mais je vous demande de regarder attentivement les liens que je viens de publier et de réessayer. Si vous pensez que c'est un bug, nous devrions le tester et le réparer.

Federico

+1

Bonjour, j'irai sur un autre projet la semaine prochaine mais j'informerai le prochain développeur de jeter un oeil. Je suis sûr que j'ai fait une erreur mais pour le moment je n'ai pas le temps d'enquêter.Merci pour vos conseils – GwydionFR