使用 Algolia for Django 索引 Taggit 标签:“_TaggableManager”对象没有属性 'name'

Indexing Taggit tags with Algolia for Django: '_TaggableManager' object has no attribute 'name'

我在使用 Algolia Django integration 和我的一个包含 TaggitManager() 字段的模型时遇到了一些问题。当 运行 这个命令时,我目前被抛回以下错误:

$ python manage.py algolia_reindex

AttributeError: '_TaggableManager' object has no attribute 'name'

我看过 Taggit documentation,但我不确定我将如何与 Algolia 搜索索引方法概述的方法相结合。

index.py:

import django
django.setup()

from algoliasearch_django import AlgoliaIndex

class BlogPostIndex(AlgoliaIndex):
    fields = ('title')
    settings = {'searchableAttributes': ['title']}
    index_name = 'blog_post_index'

models.py:

from taggit.managers import TaggableManager

class Post(models.Model):
    ...some model fields...

    tags = TaggableManager()

既然没有人回答,我告诉你我是如何解决这个问题的,但我不得不说这不是一个好方法,根本不是 "clean" 解决方案。所以我所做的是进入站点包中的 "taggit managers" (env->lib->python2.x/3.x-> site_packages->taggit->managers.py) 在 managers.py 文件中,您将在第 394 行找到这段漂亮的代码:

def __get__(self, instance, model):
            if instance is not None and instance.pk is None:
                raise ValueError("%s objects need to have a primary key value "
                                 "before you can access their tags." % model.__name__)
            manager = self.manager(
                through=self.through,
                model=model,
                instance=instance,
                prefetch_cache_name=self.name,  # this is the line I comment out when building the index,
                name=self.name  #this is the line I added and needs to be commented out after the index is build. 
            )
            return manager

因此,当我想重建搜索索引时,我所做的是注释掉(在该行前面加上“#”)prefetch_cache_name=self.name, 并将其替换为 name=self.name。因此,构建索引将起作用。索引完成构建后,您必须将所有内容恢复原样(再次将“#”切换为 name=self.name 并再次保持 prefetch_cache_name=self.name, 可见)。

如前所述,这可能不是最好的方法,但我有同样的痛苦,这对我有用。当你有例程时,它需要一分钟。因为我必须每两周重建一次索引,这对我来说不是什么好事,但如果你必须经常这样做,这可能会很烦人......

总之希望对你有所帮助。

回答我自己的问题。我现在已经传入了模型和模型索引,所以 Algolia 现在知道要索引什么,不索引什么。虽然我想要一个方法让 Algolia 索引 taggit 标签,唉,这可能是不可能的。

我的 apps.py 文件:

import algoliasearch_django as algoliasearch
from django.apps import AppConfig
from .index import PostIndex

class BlogConfig(AppConfig):
    name = 'blog'

    def ready(self):
        Post = self.get_model('Post')
        algoliasearch.register(Post, PostIndex)

我的 index.py 文件:

from algoliasearch_django import AlgoliaIndex

class PostIndex(AlgoliaIndex):
    fields = ('title')
    settings = {'searchableAttributes': ['title']}
    index_name = 'Blog Posts Index'
    should_index = 'is_published'

这应该很管用!当您知道如何操作时,或者在尝试了大约 10 种不同的选择之后,就很简单了!

要使用您的 Post 字段为 taggit 标签编制索引,您将需要 公开一个 returns 博客 [=] 的可调用对象 38=] 的标签作为 字符串列表 .

最好的选择是将它们存储为 _tags,这样您就可以 filter on tags at query time.

您的 PostIndex 看起来像这样:

class PostIndex(AlgoliaIndex):
    fields = ('title', '_tags')
    settings = {'searchableAttributes': ['title']}
    index_name = 'Blog Posts Index'
    should_index = 'is_published'

至于Post:

class Post(models.Model):
    # ...some model fields...

    tags = TaggableManager()

    def _tags(self):
        return [t.name for t in self.tags.all()]

按照这些说明,您的记录将用它们各自的标签编入索引:

您可以查看我们的 Django 演示的 taggit branch,它演示了这些步骤。

如果您使用django==2+

,它可以帮助您

问题出在TaggableManager

get_queryset()方法中

用它打开文件(我的路径是:Pipenv(project_name)/lib/site-packages/taggit/manager.py) 查找 _TaggableManager class 并将方法名称 get_queryset 更改为 get_query_set

完成。我希望 taggit 的开发者在未来的更新中解决这个问题