2014-03-04 72 views
0

Django 1.6,Python 3.3和haystack有以下問題。基本上我試圖在乾草堆中使用LocationField,但不幸的是不是很成功。<在XXX>的點對象不是JSON可序列化

這是python trow的例外。

<Point object at 0x7fe54e41d9a0> is not JSON serializable 

和我search_indexes.py代碼:

class ListingIndex(indexes.SearchIndex, indexes.Indexable): 
    .... 
    location = indexes.LocationField(model_attr='get_location') 
    .... 

    def get_model(self): 
     return Listing 

而在models.py():

... 
from haystack.utils.geo import Point 
... 

class Listings(models.Model): 
    ... 
    def get_location(self): 
     return Point(self.lng, self.lat) 

我已經搜索在谷歌和SO和幾個小時學習了很多針對序列化Django對象的知識,但沒有找到任何結果,這有助於我在這裏找到解決方案。 在此先感謝。

+0

請提供完整的追溯。你得到的異常是由於嘗試將對象實例序列化爲JSON而造成的,這顯然是在你決定發佈的代碼之外的地方完成的。 – lanzz

+0

這是因爲Django默認使用不能序列化python對象的JSONSerializer。您可以通過將JSONSerializer更改爲PickleSerializer(這不太安全)在Django文檔中更多地瞭解此內容,從而在Django設置中更改此設置。 –

+0

一旦您知道如何更改序列化程序,請查看json的模塊文檔。您可以添加一個參數'default',將該對象轉換爲json可序列化形式。 – User

回答

0

我在這裏找到了我的解決方案。問題是,當我更新Elasticsearch時,傳遞位置Point對象的參數(因爲字段來自類型Location,我認爲這是正確的方式),但實際上,我應該做的是通過一個JSON。以下是代碼:

location = self.get_location() 
location_es = "{0},{1}".format(location.y, location.x) 

然後,當我更新Elasticsearch時,使用location_es,而不是location作爲位置字段的參數。 謝謝你的回答! :)

相關問題