/ / Índice de pajar de Django en varios campos del mismo modelo: python, django, django-haystack

Índice de Django Haystack en varios campos del mismo modelo: python, django, django-haystack

Estoy tratando de insertar elasticsearch en mi aplicación Django usando django-haystack. Estoy tratando de implementar una búsqueda de usuario. Mi modelo de usuario es este:

class MyUser(AbstractBaseUser):
username = models.CharField(max_length=255, unique=True)
name = models.CharField(max_length=63, blank=True)
email = models.EmailField(blank=True, unique=True)
status = models.CharField(max_length=255, blank=True, null=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
joined = models.DateTimeField(auto_now_add=True, null=True)

Ahora, quiero buscar en name y username campos. He creado el siguiente search_indexes.py:

class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, model_attr="name")
username = indexes.CharField(model_attr="username")

def get_model(self):
return MyUser

def get_updated_field(self):
return "joined"

Sin embargo, cuando realizo una búsqueda, solo obtengo los resultados que coinciden con name campo. ¿Qué estoy haciendo mal aquí? ¿Hay alguna otra manera de hacer esto?

Gracias por adelantado.

Respuestas

4 para la respuesta № 1

La forma en que funciona django-haystack, los datos dentro del document=True campo se utiliza para una búsqueda general, y cualquier otro campo se utiliza para el filtrado individual. Así que en tu caso, una búsqueda solo usará el name campo. Para solucionar este problema, deberá usar una plantilla que especifique todos los campos que se utilizarán en una búsqueda. En primer lugar, use:

text = indexes.EdgeNgramField(document=True, use_template=True)

Luego deberá crear una nueva plantilla dentro de su directorio de plantillas llamado search/indexes/myapp/myuser_text.txt y coloque lo siguiente adentro:

{{ object.username }}
{{ object.name }}

Ver http://django-haystack.readthedocs.org/en/latest/tutorial.html#handling-data para referencia completa