具有自定义模型字段(hashid 字段)的 Django elasticsearch DSL
Django elasticsearch DSL with custom model fields (hashid field)
我有一个模型使用 django hashid 字段作为 id
。
class Artwork(Model):
id = HashidAutoField(primary_key=True, min_length=8, alphabet="0123456789abcdefghijklmnopqrstuvwxyz")
title = ....
这是另一个型号的相关商品
class ArtworkFeedItem(FeedItem):
artwork = models.OneToOneField('artwork.Artwork', related_name='artwork_feeditem', on_delete=models.CASCADE)
现在我正在尝试设置 [django elasticsearch dsl] (https://github.com/django-es/django-elasticsearch-dsl) 并为此设置 Document
@registry.register_document
class ArtworkFeedItemDocument(Document):
class Index:
name = 'feed'
settings = {
'number_of_shards': 1,
'number_of_replicas': 0
}
artwork = fields.ObjectField(
properties={
'id': fields.TextField(),
'title': fields.TextField(
attr='title',
fields={
'suggest': fields.Completion(),
}
)
}
)
class Django:
model = ArtworkFeedItem
fields = []
related_models = [Artwork]
但是,当我尝试 rebuild
索引 python manage.py search_index --rebuild
时,出现以下异常
elasticsearch.exceptions.SerializationError: ({'index': {'_id': Hashid(135): l2vylzm9, '_index': 'feed'}}, TypeError("Unable to serialize Hashid(135): l2vylzm9 (type: <class 'hashid_field.hashid.Hashid'>)",))
Django elasticsearch dsl 显然不知道如何处理这样的 hashid 字段。
我想也许我可以自己制作 HashIdField
喜欢
from elasticsearch_dsl import Field
class HashIdField(Field):
"""
Custom DSL field to support HashIds
"""
name = "hashid"
def _serialize(self, data):
return data.hashid
然后在 'id': HashIdField
中使用它,但这给了我另一个例外
elasticsearch.exceptions.RequestError: RequestError(400, 'mapper_parsing_exception', 'No handler for type [hashid] declared on field [id]')
有谁知道我如何让它工作?
对于任何感兴趣的人,我设法通过重写 Document
的 generate_id
方法来解决这个问题,以便使用的 _id
只是一个普通字符串:
@classmethod
def generate_id(cls, object_instance):
return object_instance.id.hashid
我有一个模型使用 django hashid 字段作为 id
。
class Artwork(Model):
id = HashidAutoField(primary_key=True, min_length=8, alphabet="0123456789abcdefghijklmnopqrstuvwxyz")
title = ....
这是另一个型号的相关商品
class ArtworkFeedItem(FeedItem):
artwork = models.OneToOneField('artwork.Artwork', related_name='artwork_feeditem', on_delete=models.CASCADE)
现在我正在尝试设置 [django elasticsearch dsl] (https://github.com/django-es/django-elasticsearch-dsl) 并为此设置 Document
@registry.register_document
class ArtworkFeedItemDocument(Document):
class Index:
name = 'feed'
settings = {
'number_of_shards': 1,
'number_of_replicas': 0
}
artwork = fields.ObjectField(
properties={
'id': fields.TextField(),
'title': fields.TextField(
attr='title',
fields={
'suggest': fields.Completion(),
}
)
}
)
class Django:
model = ArtworkFeedItem
fields = []
related_models = [Artwork]
但是,当我尝试 rebuild
索引 python manage.py search_index --rebuild
时,出现以下异常
elasticsearch.exceptions.SerializationError: ({'index': {'_id': Hashid(135): l2vylzm9, '_index': 'feed'}}, TypeError("Unable to serialize Hashid(135): l2vylzm9 (type: <class 'hashid_field.hashid.Hashid'>)",))
Django elasticsearch dsl 显然不知道如何处理这样的 hashid 字段。
我想也许我可以自己制作 HashIdField
喜欢
from elasticsearch_dsl import Field
class HashIdField(Field):
"""
Custom DSL field to support HashIds
"""
name = "hashid"
def _serialize(self, data):
return data.hashid
然后在 'id': HashIdField
中使用它,但这给了我另一个例外
elasticsearch.exceptions.RequestError: RequestError(400, 'mapper_parsing_exception', 'No handler for type [hashid] declared on field [id]')
有谁知道我如何让它工作?
对于任何感兴趣的人,我设法通过重写 Document
的 generate_id
方法来解决这个问题,以便使用的 _id
只是一个普通字符串:
@classmethod
def generate_id(cls, object_instance):
return object_instance.id.hashid