Django elasticsearch DSL с пользовательскими полями модели (поле 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]')

Кто-нибудь знает, как я могу заставить это работать?

Для тех, кому интересно, я смог решить эту проблему, переопределив метод generate_id в Document таким образом, чтобы _id использовалась обычная строка:


    @classmethod
    def generate_id(cls, object_instance):
        return object_instance.id.hashid
Вернуться на верх