使用Algolia为Django索引Taggit标签:'_ TaggableManager'对象没有属性'name'

时间:2017-06-19 21:17:50

标签: django algolia django-taggit

我使用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'

4 个答案:

答案 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()]

按照这些说明,您的记录将使用各自的标记编制索引:

Screenshot of a tagAlgolia explorer

您可以查看我们的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的开发人员在以后的更新中解决此问题