我使用Algolia Django integration和我的一个包含__delete__
字段的模型时遇到了一些问题。运行此命令时,我当前正被抛回以下错误:
TaggitManager()
我看过Taggit documentation,但我不确定如何将Algolia搜索索引方法概述的方法结合起来。
index.py:
$ python manage.py algolia_reindex
AttributeError: '_TaggableManager' object has no attribute 'name'
models.py:
import django
django.setup()
from algoliasearch_django import AlgoliaIndex
class BlogPostIndex(AlgoliaIndex):
fields = ('title')
settings = {'searchableAttributes': ['title']}
index_name = 'blog_post_index'
答案 0 :(得分:5)
要使用您的帖子字段为taggit
标记编制索引,您需要公开一个可调用的,它会将Blog Post的标记作为字符串列表返回。
最好的选择是将它们存储为_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,演示了这些步骤。
答案 1 :(得分:1)
回答我自己的问题。我现在已经传递了模型和模型索引,因此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种不同的选择后,这很简单!
答案 2 :(得分:0)
所以既然没有人回答我告诉你我是如何解决这个问题的,但我不得不说这不是一个好方法,而不是一个"清洁"解决方案。所以我做的是进入" taggit经理"在site-packages中(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,
。
如前所述,这可能不是最好的方法,但我有同样的痛苦,这对我有用。你有这个例程需要一分钟。因为我必须每两周重建一次索引,所以对我来说这不是一件好事,但如果你不得不经常这样做,那可能会很烦人......
无论如何,我希望能帮助你。
答案 3 :(得分:0)
如果您使用PrintStream.class.getMethod("print", type)
问题出在const express = require('express');
const path = require('path');
const app = express();
const publicDir = path.join(__dirname,'../public')
app.use(express.static(publicDir));`
的{{1}}方法中
使用它打开文件(我的路径是:django==2+
)
找到get_queryset()
类,并将方法名称TaggableManager
更改为Pipenv(project_name)/lib/site-packages/taggit/manager.py
完成。希望taggit的开发人员在以后的更新中解决此问题