GeoDjango PointField| JSON序列化器|坐标

fhg3lkii  于 4个月前  发布在  Go
关注(0)|答案(1)|浏览(59)

我的APP里有这个问题。
当我尝试创建一个属性为"location"的GeoDjango PointField的用户时,只有设置为"default"的值被保存.当我用postman发送请求时,"location field"被忽略。
在已安装的应用程序中:. djangorestframework-gis,django. contrib. gis.
安装postgis并使用postgis扩展创建数据库。
这是www.example.com用户对象的一部分

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--> 0101000020E61000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我不知道我做错了什么,这是令人沮丧的.我认为我的JSON是错误的,这是串行化保存默认的方式。
正如你所看到的,我在序列化器上的位置字段被注解了。那么我需要只为位置字段制作序列化器,然后将其嵌入到UserSerializer中吗?

解决方案:在此问题上花费20天后。

  1. for models使用django gis models
    第一个月
    1.使用该模型。PointField()
    location = models.PointField(geography=True, srid=4326)
    1.需要安装DRF GIS并使用此序列化程序
    from rest_framework_gis.serializers import GeoModelSerializer
    1.当您子类化序列化程序时,用途:
    geo_field = 'point'
    class Meta:中作为属性。
    然后当你以评论中指定的格式发布json时:
{ "location": { "type":"Point", "coordinates": "[34.000, 21.000]" }}


一切都要正常

7gcisfzg

7gcisfzg1#

对于任何人在这个问题上,这里是如何处理这个问题的文件。
https://github.com/openwisp/django-rest-framework-gis?tab=readme-ov-file#serializers
例如,我需要这样做才能使它工作:
“注意:对于ver>=0.9.3:DRF模型串行器将给予与上面相同的输出,如果;

  • rest_framework_gis在settings中设置。
    *序列化程序中的字段显式设置为GeometryField。

相关问题