2017-08-15 3 views
0

Salut j'ai un certain projet Django 11, regardez mon modèle commevue Django objets filtre avec timezone.now(). Date ou timezone.now(). De temps> chaîne attendue ou octets comme objet-

class Event(models.Model): 
    name = models.CharField(max_length=100, unique=True) 
    title = models.CharField(max_length=100) 
    info = models.CharField(max_length=100) 
    image = models.ImageField(upload_to='events/%Y/%m/%d') 
    start_date = models.DateField(default=timezone.now) 
    start_time = models.TimeField(default=timezone.now) 
    stop_date = models.DateField(default=timezone.now) 
    stop_time = models.TimeField(default=timezone.now) 

    place = models.ForeignKey('places.Place', on_delete=models.CASCADE) 
    company = models.ForeignKey('companies.Company', on_delete=models.CASCADE) 

et moi ressemblent

def place_website(request, place_id): 

    place_template = get_template('room.html') 

    place_obj = Place.objects.filter(id=place_id) 

    # filter for event obejts only for requested place, filtered for now and next events 
    place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date) 

    place_events_next = Event.objects.filter(place=place_id, start_date=timezone.now(), stop_date__gte=timezone.now()).order_by('start_time') 

    place_context = { 
     'place_obj': place_obj, 
     'place_event_now': place_event_now, 
     'place_events_next': place_events_next, 
    } 

    return HttpResponse(place_template.render(place_context)) 

la chose que je veux gérer est de passer à le modèle la liste des objets d'événements filtrés en fonction du temps.

permet de choisir cette ligne

place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date) 

il erreur couse « Expected chaîne ou objet octets comme » mais quand je supprimer « .date » de « timezone.now() » disparaissent erreur (alors filtre ne rien faire) mais je veux comparer la date à la date et l'heure.

Comment faire cela correctement?

Cette approche pour filtrer les objets dans la vue plutôt que dans le modèle est correcte?

###### MISE À JOUR ########

Son werid car après correction j'ai maintenant aucune erreur mais queryset n'est pas correctement filtrée, ressembler à seulement deux premier paramètre est le filtrage ok et l'autre deux provoque un jeu de requête vide.

place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().strftime('%Y-%m-%d'), start_time__lte=timezone.now().strftime('%H:%M:%S'), stop_time__gte=timezone.now().strftime('%H:%M:%S')) 

I mon temps de base de données est enregistré au format H: M:. S et timezone.now() le temps() a un format différent donc je modifié filtre avec .strftime cette aide na pas, ce que je wont est de limiter "place_event_now" queryset à objet particulier/objets qui se réalisent avec condition start_time < heure actuelle < stop_time.

Un autre cas est avec place_event_next

place_events_next = Event.objects.filter(place=place_id, start_date=timezone.now().strftime('%Y-%m-%d'), stop_date__gte=timezone.now().strftime('%Y-%m-%d'), start_time__gt=timezone.now().strftime('%H:%M:%S')).order_by('start_time') 

lorsque l'événement i filtrer les objets que start_time est supérieure à timezone.now() ils sont encore en queryset.

Est-ce que je fais quelque chose de mal?

+0

Vous manquez les parenthèses '.date()' –

+0

https://docs.djangoproject.com/en/1.11/topics/i18n/timezones/ – Alexander

+0

@ SébastienDeprez les gars c'est ça !!! Merci beaucoup !!! –

Répondre

0

Peut être vous avez besoin d'appeler date-date() remplacer

filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date) 
#             ^^^         ^^^ 

à

filter(place=place_id, start_date=timezone.now().date(), stop_date__gte=timezone.now().date()) 
#             ^^^         ^^^ 
+0

peut-être vous avez besoin de 'start_date__gte =' au lieu de 'start_date =' ajouter __gte –

+0

je veux limiter le jeu de requête aux événements pour aujourd'hui, donc je pense qu'il devrait être start_date sans __gte? droite ? –

+0

cela vous aide 'start_date__date'? –

0

Je pensais que ce que timezone.now() temps de retour pas dans mon fuseau horaire actuel, i changer à timezone.localtime() et tout fonctionne parfaitement !!!