django-haystack - как собрать несколько приложений на одной странице поиска? - PullRequest
1 голос
/ 10 марта 2012

В Django-haystack есть примеры того, как сделать одно приложение доступным для поиска. Мы это прекрасно! Однако, если у вас есть более одного приложения, и каждое из них связано с пользователем, как бы вы поступили имея стог сена (граненый), чтобы вы могли искать то, что вы хотите. Скажем, на всех трех из этих моделей.

Пример: показать мне всех пользователей мужского пола, которые имеют в своем описании ключевое слово "опытный" и которые также имеют навык с именем «Аналитик», в ключевых словах которого содержится слово «бла».

Я гуглил без результата. Итак, я собираюсь добавить несколько приложений на одну и ту же страницу поиска.

class UserProfile(models.Model):

    GENDER_MALE = 1
    GENDER_FEMALE = 2
    GENDER_CHOICES = (
        (GENDER_MALE, 'Male'),
        (GENDER_FEMALE, 'Female'),
    )

    user = models.OneToOneField(User, related_name="%(class)s", unique=True)

    full_name = models.CharField(
                _("Full name"), 
                max_length=200, 
                blank=True, 
    )

    gender = models.IntegerField(
                _('Gender'),
                choices=GENDER_CHOICES,
                blank=False,
                null=True,
    )

    # common
    country = CountryField(
                _('Country'),
                null=True,
                blank=False,
    )

    # common
    about = models.TextField(
                _('About Me'), 
                blank=True, 
                validators=[MaxLengthValidator(400)],
    )

    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)


    def __unicode__(self):
        return u'%s' % (self.user.username)


class Skill(models.Model):

    user = models.ForeignKey(
                User, 
                related_name="%(class)s"
    )

    name = models.CharField(
                _('Skill Name'),
                max_length=70,
                null=False
    )

    category = models.ForeignKey(
                'self',
                blank=True,
                null=True
    )

    is_active = models.BooleanField(
                default=True
    )

    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __unicode__(self):
        return u'%s' % (self.name)

class Info(models.Model):
    user = models.ForeignKey(
                User,
                related_name="%(class)s",
                null=False
    )

    description = models.TextField(
                blank=False, 
    )

    keywords = models.CharField(
                blank=True,
                null=True, 
                max_length=56,
    )

    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __unicode__(self):
        return u'%s' % self.title

1 Ответ

1 голос
/ 25 июня 2013

Я думаю, если я не ошибаюсь, ваш вопрос заключается в том, как заставить фасеты работать для нескольких приложений.

В url.py попробуйте что-то вроде

sqs = SearchQuerySet().facet('field1').facet('field2').facet('field3') 

urlpatterns += patterns('haystack.views',
url(r'^$', FacetedSearchView(form_class=FacetedSearchForm, searchqueryset=sqs), name='haystack_search'),) 

В search.html

{% if facets.fields.field1 %} {% for type1 in facets.fields.field1 %} 
{{ type1.0 }} ({{ type1.1 }}) {% endfor %} {% else %} 
No type1 facets.

{% endif %} 
{% if facets.fields.field2 %} {% for author in facets.fields.field2 %} 
{{ type2.0 }} ({{ type2.1 }}) {% endfor %} {% else %} 
No type2 facets.

{% endif %} 
{% if facets.fields.field3 %} {% for author in facets.fields.field3 %} 
{{ type3.0 }} ({{ type3.1 }}) {% endfor %} {% else %} 
No type3 facets.

{% endif %} 

Ваши приложения должны иметь отдельные файлы search_index.

Проверьте выходные данные rebuild_index и update_index, правильно ли выполняется индексация.

...