2016-12-04 5 views
1

J'utilise django Haystack avec ElasticSearch backend. Dans mon modèle, j'ai un DateTimeField qui crée des problèmes lors de la reconstruction des index.Django Haystack ne peut pas indexer le champ datetime

Mon modèle est comme ceci:

class MyModel(models.Model): 
    action = models.DateTimeField() 

ma classe Index est comme:

Class MyModelIndex(indexes.SearchIndex, indexes.Indexable): 
    action_time = indexes.DateTimeField(null=True, model_attr="action") 

La valeur je suis arrivé dans la coquille de l'instance particulière qui crée problème est

obj = MyModel.objects.get(id=1) 
obj.action 
Out[56]: datetime.datetime(2016, 6, 21, 14, 6, 37, 430691, tzinfo=<UTC>) # result or value of action field 

Et l'erreur que je reçois lors de la création d'index est

if not language_code_re.search(lang_code): 
     TypeError: expected string or buffer 

J'ai essayé de revenir strftime d'index de préparer le terrain, mais il ne fonctionne pas non plus

def prepare_action_time(self, obj): 
     return obj.action.strftime('%Y-%m-%dT%H:%M:%SZ') if obj.action else None 

mais il fonctionne si je retourne la représentation unicode de la valeur datetime comme

def prepare_action_time(self, obj): 
     return unicode(obj.action) if obj.action else None 

ou sans utiliser use_template=False dans mon index de recherche Je suis en mesure d'indexer les documents ou les objets

Mais je suis incapable d'obtenir wher Le problème réel est. Aide sera appréciée

Répondre

0

Pour reproduire, démarrez un nouveau projet en utilisant le modèle de projet de Django. Je crois que USE_L10N = True expose le problème, bien qu'il puisse s'agir d'une combinaison de paramètres.

Visitez le même lien Ivan donné, et vérifiez vos paramètres si USE_I10N paramètres. Faites-le USE_L10N = False de USE_L10N = True, et votre code fonctionnera. Pour plus d'informations, voir https://code.djangoproject.com/ticket/24569.

change USE_L10N = True to USE_L10N = False, 
+0

Oui, cela fonctionne après avoir changé les paramètres USE_L10N. Merci –

+0

Oui, bien que vous ayez encore à travailler dans un scénario réel. – Ivan

0

Vous devez définir le language code dans vos paramètres.

S'il n'est pas défini, le get_language de Django renvoie None et il y a du code qui ne l'attend pas. Pour plus d'informations, voir https://code.djangoproject.com/ticket/24569.

+0

il est déjà mis là dans la mise 'LANGUAGE_CODE = « en-us'' –

+0

@rajpreetsingh pouvez-vous ajouter version django à votre question? – Ivan

+0

La version django est 1.8 –