Elasticsearch.exceptions.SerializationError + Django
Встраиваю эластичный поиск в свое приложение, но когда запускаю его, получаю эту ошибку :
raise TypeError("Unable to serialize %r (type: %s)" % (data, type(data)))
TypeError: Unable to serialize <QuerySet [<AccountTypes: MENTOR>]> (type: <class 'django.db.models.query.QuerySet'>)
elasticsearch.exceptions.SerializationError: ({'owner': {'id': 2, 'email': 'huxy@gmail.com', 'username': 'huxy', 'auth_provider': 'email', 'account_types': <QuerySet [<AccountTypes: MENTOR>]>, 'profile': <Profile: None Idris>, 'uuid': UUID('d4a5cae3-44ad-49c0-bf89-cc5f4d993667'), 'status': 'PENDING'}, 'tags': [], 'comments': [], 'grade_level': {}, 'title': 'Math is fun', 'body': 'Math is nice, now I like it so much, this is awesom', 'image': '', 'status': 'DRAFT'}, TypeError("Unable to serialize <QuerySet [<AccountTypes: MENTOR>]> (type: <class 'django.db.models.query.QuerySet'>)"))
Что может быть одной вещью, которая отсутствует, ниже приведены мои фрагменты кода.
Это моя модель для пользователя :
class User(MainProcess, django_models.AbstractBaseUser, TimeStampedModel,
django_models.PermissionsMixin):
"""
User model for the user creation
"""
uuid = models.UUIDField(unique=True, max_length=500,
default=uuid.uuid4,
editable=False,
db_index=True, blank=False, null=False)
email = models.EmailField(_('Email'), db_index=True, unique=True)
is_verified = models.BooleanField(_('Is verified'), default=False)
is_staff = models.BooleanField(_('Is staff'), default=True)
is_active = models.BooleanField(_('Is Active'), default=True)
username = models.CharField(_('Username'), max_length=255,
blank=True, null=True)
account_types = models.ManyToManyField(AccountTypes,
related_name='account_types')
auth_provider = models.CharField(
max_length=255, blank=False,
null=False, default=AUTH_PROVIDERS.get('email'))
status = models.CharField(
choices=UserProcess.states,
default=PENDING, max_length=100, blank=True)
objects = UserManager()
USERNAME_FIELD = 'email'
class Meta:
verbose_name = 'User'
verbose_name_plural = 'Users'
Тогда это модель Post :
class Post(MainProcess, TimeStampedModel, models.Model):
"""Post model."""
title = models.CharField(_('Title'), max_length=100, blank=False,
null=False)
image = models.ImageField(_('Image'), upload_to='blog_images', null=True,
max_length=900)
body = models.TextField(_('Body'), blank=False)
description = models.CharField(_('Description'), max_length=400,
blank=True, null=True)
slug = models.SlugField(default=uuid.uuid4(), unique=True, max_length=100)
owner = models.ForeignKey(User, related_name='posts',
on_delete=models.CASCADE)
bookmarks = models.ManyToManyField(User, related_name='bookmarks',
default=None, blank=True)
address_views = models.ManyToManyField(CustomIPAddress,
related_name='address_views',
default=None, blank=True)
likes = models.ManyToManyField(User, related_name='likes', default=None,
blank=True,
)
Тогда мой файл documents.py :
Похожая проблема, как в SerializationError Rebuilding Elastic Search Django App задан вопрос.
Проблема возникает потому, что ваше поле 'account_types' является полем ManyToMany и при возврате оно возвращает кверисет, который не может быть сериализован elasticsearch.
Перед возвратом account_types поместите его в list() или вы можете использовать list comprehension.