Как сериализовать Django GeoPt для Elasticsearch - PullRequest
0 голосов
/ 31 мая 2018

Как определить GeoPointField () вasticsearch django.Он показывает ошибку сериализации, когда я пытаюсь сохранить экземпляр.Я использую библиотеку "django_elasticsearch_dsl code:

from django_elasticsearch_dsl.fields import GeoPointField
geolocation = GeoPointField()

, когда я пытаюсь сохранить данные

 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'>

метод get_lat_long

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

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Проблема в том, что get_lat_long() возвращает объект типа django_google_maps.fields.GeoPt, и вы не можете присвоить его вашему 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()
0 голосов
/ 31 мая 2018

Проблема в том, что django_elasticsearch_dsl (и далее elasticsearch_dsl) не знает, как сериализовать этот пользовательский объект django_google_maps.fields.GeoPt в формат, понятный Elasticsearch.

Цитирование документов, объект должен иметь метод to_dict().

Используемый нами сериализатор также позволит вам сериализовать ваши собственные объекты - просто определите метод to_dict() для ваших объектов ион будет автоматически вызываться при сериализации в json.

Вы сможете подключить этот метод к чему-то вроде (сухого)

from django_google_maps.fields import GeoPt

GeoPt.to_dict = lambda self: {'lat': self.lat, 'lon': self.lon}

в начале вашегокод приложения (метод AppConfig ready() является хорошим выбором или неудачный, например models.py)

...