elasticsearch-dsl,Python,Django 1.9,elasticsearch Dsl" /> elasticsearch-dsl,Python,Django 1.9,elasticsearch Dsl" />

Python 如何为Elasticsearch序列化Django GeoPt

Python 如何为Elasticsearch序列化Django GeoPt,python,django-1.9,elasticsearch-dsl,Python,Django 1.9,elasticsearch Dsl,如何在elasticsearch django中定义GeoPointField()。当我试图保存实例时,它显示序列化错误。我正在使用库“django_elasticsearch_dsl” 代码: 当我试图保存数据时 user = GutitUser.objects.get(phone_number=phone_number) lat, lon = get_lat_long() user.geolocation.lat = lat user.geolocation.lon = lon u

如何在elasticsearch django中定义GeoPointField()。当我试图保存实例时,它显示序列化错误。我正在使用库“django_elasticsearch_dsl” 代码:

当我试图保存数据时

 user = GutitUser.objects.get(phone_number=phone_number)
 lat, lon = get_lat_long()
 user.geolocation.lat = lat
 user.geolocation.lon = lon
 user.save()
它显示错误:

 "Unable to serialize <django_google_maps.fields.GeoPt object at 0x7f5ac2daea90>
 (type: <class 'django_google_maps.fields.GeoPt'>

问题是
django\u elasticsearch\u dsl
(而且,
elasticsearch\u dsl
)不知道如何将自定义
django\u google\u maps.fields.GeoPt
对象序列化为elasticsearch可以理解的格式

引用,对象将需要有一个
to_dict()
方法

我们使用的序列化程序还允许您序列化自己的对象-只需在对象上定义一个
to_dict()
方法,序列化为json时将自动调用该方法

您应该能够使用类似(干编码)的东西来修补该方法


在应用程序代码的早期(AppConfig
ready()
方法是一个不错的选择,如果失败,比如
models.py
),问题在于返回类型为
django\u google\u maps.fields.GeoPt
的对象,您无法将is分配给您的
geolocation
对象。但按如下方式修改代码可能会奏效:

 user = GutitUser.objects.get(phone_number=phone_number)
 geo_point = get_lat_long()
 user.geolocation.lat = geo_point.lat
 user.geolocation.lon = geo_point.lon
 user.save()

您是否也可以显示
get\u lat\u long()
方法?现在它显示错误-->传输错误(400,u'search\u phase\u execution\u exception',u'failed to find geo\u point field[geolocation]”,这意味着您的Elasticsearch索引不包含该字段。
def get_lat_long(request):
    ip = json.loads(requests.get('https://api.ipify.org?format=json').text)['ip']

    lat, lon = GeoIP().lat_lon(ip)
    return lat, lon
from django_google_maps.fields import GeoPt

GeoPt.to_dict = lambda self: {'lat': self.lat, 'lon': self.lon}
 user = GutitUser.objects.get(phone_number=phone_number)
 geo_point = get_lat_long()
 user.geolocation.lat = geo_point.lat
 user.geolocation.lon = geo_point.lon
 user.save()