2010-06-06 6 views
5

J'ai trouvé ce lien: http://code.djangoproject.com/attachment/ticket/8424/time_filters.diff et changé mes fichiers django 1.2 en ajoutant ce que vous pouvez voir là-bas.
Mais maintenant, quand je suis en train d'écrire Entry.objects.filter (pub_date__hour = x) - le résultat suit l'erreur:Django filtre par heure

Field has invalid lookup: hour

Que dois-je faire d'autre, pour le faire fonctionner?

(désolé pour mon anglais)

+0

Je ne suis pas tout à fait sûr si ce patch est destiné à fonctionner avec 1.2. –

Répondre

0

Peut-être que vous avez défini pub_date comme DateField, mais il doit être un DateTimeField? Pouvez-vous inclure dans la question votre code de définition de modèle?

+0

oui - c'est DateTimeField – DJPy

4
Entry.objects.filter(pub_date__hour = x) 

n'est pas pris en charge à partir de django 1.2 - seulement année, mois, jour, semaine_jour.

Utilisez quelque chose comme ceci:

Entry.objects.filter(pub_date__regex = '08:00') 

ou

Entry.objects.filter(pub_date__contains = '08:00') 

qui vous donnera tous les objets d'entrée à l'heure (toutes les années).

1

probablement mieux d'utiliser une requête SQL brute comme:

Whatever.objects.raw("SELECT * FROM table WHERE TIME(pub_date) LIKE '%%08:30%%' ") 
2

Django 1.7 Ajout du support pour les recherches personnalisées et des transformations. Une heure de transformation est mis en œuvre comme suit sur PostgreSQL:

class HourExtract(models.Transform): 
    lookup_name = 'hour' 
    output_type = models.IntegerField() 

    def as_sql(self, compiler, connection): 
     lhs_sql, lhs_params = compiler.compile(self.lhs) 
     return "EXTRACT(hour FROM %s)" % lhs_sql, lhs_params 

models.DateTimeField.register_lookup(HourExtract) 

vous pouvez maintenant faire .filter (pub_date__hour__lte = x) et d'autres requêtes similaires sur la valeur de l'heure.

+0

Lorsque je fais cela et que j'essaie de filtrer en utilisant MyModel.objects.filter (date__hour = 8), django dit qu'il attend un strnig ou un buffer comme si la date__heure était attendue comme datetime et non comme un entier –