GeoDjango PointField | JSON 序列化器 |坐标

问题描述 投票:0回答:1

所以我的应用程序中遇到了这个问题。

当我尝试创建具有 GeoDjango PointField 属性“位置”的用户时,仅保存设置为“默认”的值...当我使用邮递员发送请求时,该“位置字段”将被忽略。

在已安装的应用程序中: ... djangorestframework-gis, django.contrib.gis ...

Postgis 已安装,并使用 postgis 扩展创建数据库。

这是 models.py 用户对象的一部分

class User(AbstractBaseUser):
    ...
    location = models.PointField(geography=True, spatial_index=True,default=Point(0.0, 0.0, srid=4326))
    ...

这是我尝试的 JSON:

{
"location": "POINT(-120.18444970926208 50.65664762026928)"
}

{
 "location": {
     "type":"Point",
     "coordinates": "[34.000, 21.000]"
     }
}

{
 "location": {
     "type":"Point",
     "coordinates": {
         "lng":"21.000",
         "lat":"32.000"
     }
 }
  }

class UserSerializer(serializers.ModelSerializer):
"""
Serializer for user object
"""
class Meta:
    model = User
    fields = '__all__'


def create(self, validated_data):
    user = User.objects.create_user(
        email=validated_data['email'],
        first_name=validated_data['first_name'],
        last_name=validated_data['last_name'],
        address=validated_data['address'],
    )
    # user.location = validated_data['location']
    user.username = validated_data['username']
    user.set_password(validated_data['password'])
    user.save()
    return user


class UpgradeUserSerializer(serializers.ModelSerializer):

user = UserSerializer(required=True)

class Meta:
    model = UpgradeUser
    fields = ('user',
              'upgrade_name',
              'oib',
              'upgrade_address',
              'legal_representative',
              'gsm',
              'marketplace_seller',
              'weekend_delivery'
              )

def create(self, validated_data):

    user_data = validated_data.pop('user')

    user = UserSerializer.create(UserSerializer(),     validated_data=user_data)
    user.is_upgrade = True
    user.save()

    upgrade_user = UpgradeUser.objects.create(
        user=user, **validated_data
    )

    upgrade_user.save()
    return upgrade_user

在数据库中,位置字段填充默认坐标,即 0.0、0.0。 DB GeoHash --> 0101000020E610000000000000000000000000000000000000

我不知道我做错了什么,这令人沮丧...... 我认为我的 JSON 是错误的,这就是序列化程序保存默认值的方式。

正如您所看到的,我在序列化器上的位置字段已被注释。那么我是否需要仅为位置字段创建序列化器,然后将其嵌入到 UserSerializer 中?



解决方案:花了 20 天解决这个问题。

  1. 对于模型使用django gis模型

    from django.contrib.gis.db import models

  2. 使用 models.PointField()

    location = models.PointField(geography=True, srid=4326)

  3. 需要安装DRF GIS并使用此序列化器

    from rest_framework_gis.serializers import GeoModelSerializer

  4. 当您子类化序列化器时使用:

    geo_field = 'point'

class Meta:
作为属性。

然后当你以评论中指定的格式发布 json 时:

{ "location": { "type":"Point", "coordinates": "[34.000, 21.000]" }}

一切都必须顺利。

json django coordinates postgis geodjango
1个回答
0
投票

对于任何遇到此问题的人,这里是如何处理此问题的文档。

https://github.com/openwisp/django-rest-framework-gis?tab=readme-ov-file#serializers

例如,我需要这样做才能使其正常工作:

” 注意:对于 ver>=0.9.3:DRF 模型序列化器将给出与上面相同的输出,如果;

  • rest_framework_gis 在 settings.INSTALLED_APPS 中设置或
  • 序列化器中的字段被显式设置为 GeometryField。"
© www.soinside.com 2019 - 2024. All rights reserved.