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.

Вернуться на верх