3

J'essaye d'obtenir django-haystack (en utilisant un backend xapian) pour indexer mon modèle ici pour la recherche, par les champs name et . J'ai une sous-classe Item, Device, qui ajoute un champ manufacturer.Dans django-haystack, comment puis-je utiliser des sous-classes de modèles?

Le modèle Item est défini ainsi:

class Item(models.Model): 
    name = models.CharField(max_length=255, unique=True) 
    description = models.TextField(null=True, blank=True) 
    compatible_with = models.ManyToManyField('self', null=True, blank=True) 
    often_with = models.ManyToManyField('self', null=True, blank=True) 
    created_by = models.ForeignKey(User, null=True, blank=True, related_name='created_by') 
    verified = models.BooleanField(default=False) 
    verified_by = models.ForeignKey(User, null=True, blank=True, related_name='verified_by') 
    date_created = models.DateField(auto_now_add=True) 
    slug = models.SlugField(max_length=300, null=True, blank=True) 

Ma sous-classe de SearchIndex de django-botte de foin ressemble à ceci:

class ItemIndex(SearchIndex): 
    text = CharField(document=True, use_template=True) 
    name = CharField(model_attr='name') 
    description = CharField(model_attr='description') 

site.register(Item, ItemIndex) 

J'ai mis en place ce modèle, dans templates/search/indexes/catalog/item_text.txt:

{{ object.name }} 
{{ object.description }} 

Qu'est-ce que j'ajoute à item_text.txt tel que le champ manufacturer est indexé, si et seulement si l'objet de modèle est une instance de Device?

Répondre

3
{% if device.manufacturer %} 
{{ device.manufacturer }} 
{% endif %} 

... le tutoriel Haystack est un peu confus à ce sujet (vous n'avez pas fait d'utiliser un modèle fichier texte, pour une personne), mais l'idée de base est que le moteur de Haystack va à la ville sur quelles que soient les données de texte dans ce modèle.

En fait, il va à la ville sur tout ce qui est dans la réponse que vous lui envoyez, mais si vous avez le modèle configuré, vous pouvez utiliser n'importe quelle logique de modèle Django que vous voulez.

(notez que l'étiquette de modèle if était un peu petit déjeuner d'un chien avant Django 1.2, si vous êtes coincé sur une version Django plus tôt vous devrez peut-être modifier la syntaxe, mais le principe est le même.)

+0

Merci :) cela a fait l'affaire. –

+0

heureux de l'entendre. – fish2000