具有多个模型的干草堆搜索

haystack search with multiple models

在我的项目中,我有两个表(用户、语言)。每个用户至少有一个'Language'。

我希望能够按语言或位置进行搜索,并在搜索结果中看到用户名 language/s 和国家/地区。

我有以下型号:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    state = models.CharField(max_length=200,default='',blank=True, null=True)
    country = models.CharField(max_length=200,default='',blank=True, null=True)

    def __unicode__(self):
        return unicode(self.user)

class Language(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserProfile')
    language = models.CharField(max_length=200,default='',blank=True, null=True)

    def __unicode__(self):
        return unicode(self.user)

我已经做到了:

class UserIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    city = indexes.CharField(model_attr='city')
    zip = indexes.CharField(model_attr='zip')
    country = indexes.CharField(model_attr='country')

    def get_model(self):
        return UserProfile
    def index_queryset(self, using=None):
        return self.get_model().objects.all()

我的userprofile_text.txt:

{{ object.user.get_full_name }}
{{ object.language}} <-- of course this doesn't work.
{{ object.country}}
{{ object.zip}}

我可以使用名称、邮政编码和国家/地区进行搜索并相应地显示结果如何修改我的代码以便我也可以按语言进行搜索?另外,我将如何显示与每个用户相关的所有语言?

类似于:

{% for language in result.object.languages %}
{{ language }}
{% endfor %}

到目前为止,我在 SO 上找到的都是过时的答案或与 haystack 无关的答案。有帮助吗?

由于您正在使用从 LanguageUser without a related_nameForeignKey,因此您需要访问用户对象上的 language_set

{{ object.user.get_full_name }}
{% for language in object.user.languages %}
    {{ language }}
{% endfor %}

这为您提供了一个用户所有语言的列表。


不过,问题主要出在你的建模上。这个块:

class Language(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserProfile')

本质上说 "Every language has exactly one user who speaks it"。这可能不是你想要的。而是使用 ManyToManyField:

class Language(models.Model):
    id = models.AutoField(primary_key=True)
    users = models.ManyToManyField('UserProfile',related_name="spoken_languages")

{{ object.user.get_full_name }}
{% for language in object.user.spoken_languages %}
    {{ language }}
{% endfor %}

这允许一个用户说多种语言并且允许许多用户说一种语言。