gpt4 book ai didi

django - GeoDjango:距离对象不可序列化

转载 作者:行者123 更新时间:2023-12-04 00:05:51 24 4
gpt4 key购买 nike

我只是在学习 geo-django。我可以从一个点找出所有地方的距离。但是当我使用 .values带注释的方法 distance领域,我得到
TypeError: Object of type 'Distance' is not JSON serializable
这是我的代码片段

#models.py
import uuid
from django.contrib.gis.db import models
from django.contrib.gis.db.models.functions import Distance
from django.contrib.gis.geos import Point
class PlaceManager(models.GeoManager):
def get_queryset(self):
qs = super(PlaceManager, self).get_queryset()
qs = qs.annotate(
latitude=models.ExpressionWrapper(models.Func('position', function='ST_X'), output_field=models.FloatField()),
longitude=models.ExpressionWrapper(models.Func('position', function='ST_Y'), output_field=models.FloatField()),
)
return qs.distinct()

def nearby_places(self, lat, lng):
p = Point(lat, lng, srid=4326)
qs = self.get_queryset()
qs = qs.annotate(
distance=Distance('position', p)
)
return qs.order_by('distance').distinct()


class Place(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, db_index=True)
position = models.PointField()
address = models.TextField(default=None, null=True, blank=True)
objects = PlaceManager()

def __str__(self):
return '{},{}'.format(self.position.x, self.position.y)

现在我的代码片段是这样的
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response

class NearbyPlaces(APIView):
def get(self, request):
p = Place.objects.nearby_places(30.45, -90.43)
p = p.values('distance', 'address', 'latitude', 'longitude')
return Response(p, status=status.HTTP_200_OK)
p的值这里是这样的
<GeoQuerySet [{'distance': Distance(m=7596021.71574835), 'address': 'New York City, New York','latitude': 13.4586, 'longitude': 45.6789}]>

所以我在这里只需要 'distance': 7596021.71574835而不是 'distance': Distance(m=7596021.71574835)
这有什么帮助吗?提前致谢。

最佳答案

还有一个更简单的方法,只需要改变serializer.py中的内容即可:

class CitySerializer(serializers.ModelSerializer):

distance = serializers.SerializerMethodField()

def get_distance(self, obj):

return obj.distance.m

class Meta:
model = City
fields = ('distance')

关于django - GeoDjango:距离对象不可序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45376994/

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