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
Avez-vous essayé d'envoyer GeoJSON dans le POST au lieu du JSON normal? – nemesisdesign
Oui, et toujours le même message d'erreur – GwydionFR
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