gpt4 book ai didi

python - 为什么 Django Rest Framework 不显示发布的纬度?

转载 作者:行者123 更新时间:2023-12-01 06:58:55 26 4
gpt4 key购买 nike

我有一个 Django 代码库,它使用 Django Rest Framework (DRF)用于将数据库内容提供给前端的 API。

我现在还希望用户能够通过此 API 发布新内容。我有 API 可以接受 POST,但我遇到了 gis Pointfield 的问题.

在我的一个模型中,我有以下字段:

from django.contrib.gis.db import models as gis_models

class Device(models.Model):
geometry = gis_models.PointField(name='geometry', null=True, blank=True)
# And some other fields

我让人们在两个单独的字段(纬度经度)中发布几何图形,然后我想将其写入geometry 字段。我有一个 DeviceSerializer,如下所示:

类DeviceSerializer(HALSerializer): 类型= TypeSerializer(许多= True) 经度 = serializers.SerializerMethodField() 纬度=序列化器.SerializerMethodField() 组织=serializers.SerializerMethodField()

class Meta:
model = Device
fields = (
'_links',
'id',
'types',
'longitude',
'latitude',
'organisation'
)

def get_organisation(self, obj):
if obj.owner:
return obj.owner.organisation
return 'Unknown'

def get_longitude(self, obj):
if obj.geometry:
return obj.geometry.x

def get_latitude(self, obj):
if obj.geometry:
return obj.geometry.y

def create(self, validated_data):
print(validated_data) # IN HERE I DON'T RECEIVE THE POSTED LATITUDE AND LONGITUDE

types_data = validated_data.pop('types')
device = Device.objects.create(**validated_data)
for type_data in types_data:
Type.objects.create(device=device, **type_data)

if 'longitude' in validated_data and 'latitude' in validated_data:
# WE NEVER REACH THIS POINT BECAUSE THE LAT AND LONG ARE NEVER POSTED
device.geometry = Point(validated_data.pop('longitude'), validated_data.pop('latitude'))

return device

在我的测试中,我这样做:

response = self.client.post(
url,
data={'types': [], 'latitude': 1, 'longitude': 1, 'organisation': 'abc'},
format='json'
)

但是纬度经度永远不会出现在print(validated_data)中。有人知道他们为什么失踪在那里吗?

最佳答案

编辑

下面的解决方案并不像许多其他解决方案那么干净,例如这个答案 How I can create a PointField using an api? 中给出的解决方案。我建议使用这个,但如果需要的话,会将我的留在下面供其他人使用

<小时/>

问题是您在数据中发送纬度经度,但模型只有一个名为几何的字段。我看到您正在尝试使用经过验证的数据来设置此值,但经过验证的数据是根据模型的字段检查的数据,因此您将无法在此处获取它。解决这个问题的一种方法是在 View 中添加上下文。

如果您的观点是这样的:

class MyView():
def create(self, request, *args, **kwargs):
serializer = self.serializer_class(
data=request.data,
context={
"latitude": request.data.get('latitude')
"longitude": request.data.get('longitude')
},
)
if serializer.is_valid:
serilazer.save()

然后在序列化器中,您可以使用以下内容覆盖 validate 函数

def validate(self, attrs):
latitude = self.context.get("latitude")
longitude = self.context.get("longitude")
attrs.update(
{
"geometry": Point(latitude, longitude)
}
)
return super().validate(attrs)

关于python - 为什么 Django Rest Framework 不显示发布的纬度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58715233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com