Поле обязательно для POST-запросов с GeoFeatureModelSerializer и ListCreateAPIView

Было трудно найти хорошее название для этой темы. Я разрабатываю веб-сервисы с помощью django, geodjango (postgis), django-rest-framework и rest_framework_gis. Эти веб-сервисы будут использоваться в интерактивных картах.

Одной из моих моделей является следующее:

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."]}

Тем не менее, когда я заменяю GeoFeatureModelSerializer на простой ModelSerializer, все в порядке. Зачем?

Мне потребовалось около часа, чтобы найти виновного, и скоро для меня это конец рабочего дня. Любая помощь будет признательна! Спасибо, и извините за длинный пост.

[EDIT 10/11]: Мой обходной путь - использовать 2 сериализатора: один для GET и один для класса CREATE 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

1 ответ

Репозиторий django-rest-framework-gis содержит несколько примеров запроса POST для создания новых объектов, например, посмотрите на этот:

Как вы можете видеть, POSTing должен работать, если это не так, это либо ошибка, либо код, который вы используете, неправильный.

Судя по тому, что вы разместили в своем вопросе, похоже, что используемый вами формат JSON неверен. Вы сказали мне, что пытались отправить GeoJSON в запросе POST, но я прошу вас внимательно посмотреть на ссылки, которые я только что опубликовал, и повторить попытку. Если вы считаете, что это ошибка, мы должны проверить ее и исправить.

Federico

Другие вопросы по тегам