React-Native размещает объект геометрии в базе данных ГИС через Django API - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь использовать ax ios для создания сообщения в базе данных ГИС, созданной с использованием Django. Проблема в том, что у меня есть геометрическая точка в моей модели, а в моем внешнем приложении - только координаты.
Итак, теперь мой вопрос: как создать POST-запрос к таблице, содержащей объект Geometry? Вот что у меня есть на данный момент:

Django модель:

class Place(geomodel.Model):
    place_name = geomodel.CharField(max_length=256)
    description = geomodel.TextField(blank=True)
    picture = models.ImageField(blank=True)
    place_type = models.ForeignKey(PlaceType, on_delete=models.CASCADE)
    geom = geomodel.PointField()
    approved = models.BooleanField(default=False)
    telephone = models.CharField(max_length=256)
    rating = models.IntegerField()
    numberOfVotes = models.IntegerField()
    createdBy = models.ForeignKey(RegisteredUsers, on_delete=models.CASCADE)

    def __str__(self):
        return self.place_name

Django сериализатор:

PlaceSerializer(GeoFeatureModelSerializer):
    place_comments = CommentSerializer(many = True, required=False)
    dis = serializers.DecimalField(source='distance.m', required=False, read_only=True, max_digits=10, decimal_places=2)
    class Meta:
        model = Place
        geo_field = "geom"
        fields = ("id", "place_name", 'description', 'picture', 'place_type', 'dis', 'approved', 'place_comments')

Django вид:

PlaceViewSet(viewsets.ModelViewSet):
    queryset = Place.objects.all().filter(approved=True)
    serializer_class=PlaceSerializer


    def get_queryset(self):
        qs = super().get_queryset()
        latitude = self.request.query_params.get('lat', None)
        longitude = self.request.query_params.get('lng', None)
        distance = self.request.query_params.get('dist', None)

        if latitude and longitude:
            pnt = geos.GEOSGeometry('POINT(' + str(longitude) + ' ' + str(latitude) + ')', srid=4326)
            if distance:
                qs = DogPlace.objects.all().filter(geom__dwithin=(pnt, distance))            
            qs = qs.annotate(distance=Distance('geom', pnt)).order_by('distance')

        return qs

и во внешнем интерфейсе:

const createPlace = async () => {
    const data = {
        "place_name": placeName,
        "description": placeDescription,
        "geom": `SRID = 3857; POINT(${props.route.params.location.lat} ${props.route.params.location.lng})`,
        "picture": image,
        "place_type": 1,
        "approved": false
    }
    places.post(`/places/?lat=23&lng=12`, data).then(response => {
        console.log(response.data)
    })
        .catch(error => {
            console.log(error);
        })
}

Я пробовал все типы представления функции createPlace, но всегда получаю

Request failed with status code 400
- node_modules/axios/lib/core/createError.js:15:17 in createError
- node_modules/axios/lib/core/settle.js:16:9 in settle
- node_modules/axios/lib/adapters/xhr.js:52:6 in handleLoad
- node_modules/event-target-shim/dist/event-target-shim.js:818:39 in EventTarget.prototype.dispatchEvent
- node_modules/react-native/Libraries/Network/XMLHttpRequest.js:566:23 in setReadyState
- node_modules/react-native/Libraries/Network/XMLHttpRequest.js:388:25 in __didCompleteResponse
- node_modules/react-native/Libraries/vendor/emitter/EventEmitter.js:190:12 in emit
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:436:47 in __callFunction
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:111:26 in __guard$argument_0
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:384:10 in __guard
- node_modules/react-native/Libraries/BatchedBridge/MessageQueue.js:110:17 in __guard$argument_0
* [native code]:null in callFunctionReturnFlushedQueue

Думаю, мне что-то не хватает в части django, так как я не совсем новичок во всей концепции django, но если кто-то может дать мне направление, по которому можно добраться до go, было бы здорово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...