Django中的Algolia模型集成 - 处理各种字段类型的可能方式

时间:2017-06-20 21:33:48

标签: django django-models django-templates django-views algolia

我有一个具有各种不同字段类型的模型,我希望Algolia搜索引擎能够正确索引。到目前为止,我已经能够非常直接地处理models.char_fields - 我现在在想,是什么是索引各种其他字段类型的最佳方式(例如,ForeignKey“对象”,ImageFieldsDateTime字段等等。)

我注意到的一件事是,Algolia将获取并存储DateTimeField作为Unix标准时间......所以,最初我认为我可以使用{% humanize %}在模板上呈现人类可读的内容,但是没有运气。

我想知道是否有人知道从模型中拖出有用信息的方法 - 我的一个想法是在视图中抓取对象然后为每个返回的对象带出一个唯一的标识,然后处理一些条件流为了嫁给那个模特的唯一身份,那么我可以正常使用那个模型......?如:

def instant_search(request):
    posts = Post.published.all()

    context = {
        'appID': settings.ALGOLIA['APPLICATION_ID'],
        'searchKey': settings.ALGOLIA['SEARCH_API_KEY'],
        'indexName': get_adapter(Post).index_name,
        'posts': posts,
    }

    return render(request, 'blog/frame/instant_search.html', context)

我可以使用{% for posts in post %} {% if post.id = _highlightResult.id.value %} ...do some stuff {% endif %} {% endfor %}

在模板中

如果这还不够快(而且我几乎可以保证它不会)我想知道Algolia是否可以处理关键信息,例如拖出模型中定义的图像的url一个ImageField,例如,就像我在模板中使用post.image.url或者从模型中DateTime字段models.DateTimeField(default=timezone.now)获取的人类可读值。这样做真的很好,因为Algolia索引定义的模型字段......

1 个答案:

答案 0 :(得分:1)

刚想出这个:

models.py中,我必须定义属性方法,以获取Algolia理解的定制值:

例如,我在类中为我想要索引的模型定义了以下内容:

def image_url(self):
    """Get upload_to path specific to this photo: Algolia recognizable format."""
    return self.image_scroll_1.url

def published_date(self):
    """Returns a humanized date format for Algolia indexing."""
    humanized_published_date = str(self.publish.strftime("%A, %d, %B %Y %I:%M%p"))
    return humanized_published_date

希望这将有助于其他任何与Algolia合作并制定各种教程的人(我通过示例使用Django)。

然后可以在index.py中引用它们,如下所示:

来自algoliasearch_django导入AlgoliaIndex

class PostIndex(AlgoliaIndex):
    fields = ('title', 'post_author', 'lead_in', 'published_date', 'keyword_tags', 'image_url', 'get_absolute_url')

以及您可能喜欢的任何其他可选参数。