使用 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 的开发者在未来的更新中解决这个问题
我在使用 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 的开发者在未来的更新中解决这个问题