所以我的应用程序中遇到了这个问题。
当我尝试创建具有 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 中?
对于模型使用django gis模型
from django.contrib.gis.db import models
使用 models.PointField()
location = models.PointField(geography=True, srid=4326)
需要安装DRF GIS并使用此序列化器
from rest_framework_gis.serializers import GeoModelSerializer
当您子类化序列化器时使用:
geo_field = 'point'
在
class Meta:
作为属性。
然后当你以评论中指定的格式发布 json 时:
{ "location": { "type":"Point", "coordinates": "[34.000, 21.000]" }}
一切都必须顺利。
对于任何遇到此问题的人,这里是如何处理此问题的文档。
https://github.com/openwisp/django-rest-framework-gis?tab=readme-ov-file#serializers
例如,我需要这样做才能使其正常工作:
” 注意:对于 ver>=0.9.3:DRF 模型序列化器将给出与上面相同的输出,如果;