haystack搜索多个模型

时间:2015-03-15 23:33:07

标签: django django-models django-haystack

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

我希望能够按语言或位置进行搜索,并查看用户的姓名,语言和国家/地区。

我有以下型号:

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 %}

到目前为止,我所发现的所有内容都是过时的答案或与干草堆无关的答案。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

由于您使用ForeignKeyLanguage without a related_nameUser,因此您需要访问用户对象上的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')

基本上表明“每种语言都只有一个用户说话”。这可能不是你想要的。而是使用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 %}

允许用户使用多种语言来说明许多用户使用的语言。