Django弹性搜索填充外键字段

时间:2017-01-16 12:29:22

标签: python django elasticsearch

我有一个用户模型,我使用个人资料模型扩展了它:

class ProfileIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    username = indexes.CharField(model_attr='user')
    first_name = indexes.CharField(model_attr='first_name')
    last_name = indexes.CharField(model_attr='last_name')
    user = indexes.CharField(model_attr='user')

    def get_model(self):
        return Profile

    def index_queryset(self, using=None):
        """Used when the entire index for the profile model is updated"""
        return self.get_model().objects.all()

    def prepare_tags(self, obj):
        return [tag.name for tag in obj.tags.all()]

    def prepare_username(self, obj):
        return obj.user.username

    def prepare_last_name(self, obj):
        print obj.user.last_name, " : <== LAST NAME\n"
        return obj.user.last_name# 

    def prepare_first_name(self, obj):
        print obj.user.first_name, " : <== FIRST NAME\n"
        return obj.user.first_name

我希望搜索结果对象包含Django默认用户模型中的用户的名字和姓氏。我如何获得这样的结果?

1 个答案:

答案 0 :(得分:0)

documentation中,您可以发现model_attr也可以查看关系:

  

model_attr关键字参数也可以查看模型中的关系。所以你可以像model_attr='author__first_name'那样只提取作者的名字,类似于Django的ORM使用的一些查找。

所以你可以使用:

username = indexes.CharField(model_attr='user__username')
first_name = indexes.CharField(model_attr='user__first_name')
last_name = indexes.CharField(model_attr='user__last_name')

完成此操作后,您不需要准备功能,例如prepare_first_nameprepare_last_name等。