我的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天后。
- 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]" }}
型
一切都要正常
1条答案
按热度按时间7gcisfzg1#
对于任何人在这个问题上,这里是如何处理这个问题的文件。
https://github.com/openwisp/django-rest-framework-gis?tab=readme-ov-file#serializers
例如,我需要这样做才能使它工作:
“注意:对于ver>=0.9.3:DRF模型串行器将给予与上面相同的输出,如果;
*序列化程序中的字段显式设置为GeometryField。”