3

I have the following model:

class Announcement(models.Model):
    name = models.CharField(max_length=500)
    content = models.CharField(max_length=1000)
    is_active = models.BooleanField(default=False)
    date_start = models.DateTimeField()
    date_end = models.DateTimeField()

    def __str__(self):
        return self.name

I can filter the objects on is_active field like:

def announcements(request):
    announcements = Announcement.objects.all().filter(
        is_active = True
    )
    return HttpResponse(
        serializers.serialize("json", announcements))

This works fine. But when I want to filter them based on date_start field like this:

def announcements(request):
    announcements = Announcement.objects.all().filter(
        date_start >= datetime.now()
    )
    return HttpResponse(
        serializers.serialize("json", announcements))

I am getting global name 'date_start' is not defined error.

user204088
  • 1,805
  • 3
  • 17
  • 21
Sefa
  • 8,865
  • 10
  • 51
  • 82
  • possible duplicate of [How can I filter a date of a DateTimeField in Django?](http://stackoverflow.com/questions/1317714/how-can-i-filter-a-date-of-a-datetimefield-in-django) – Matt Seymour Jul 03 '15 at 09:03
  • You do not need to call .all() before using filter(), as filter() is proxied to the queryset. – Aleksander S Jul 03 '15 at 09:15

2 Answers2

4

You need to use queryset filter lookups, __gte (greater than or equal):

announcements = Announcement.objects.all().filter(date_start__gte = datetime.now())
Matt Seymour
  • 8,880
  • 7
  • 60
  • 101
3

This syntax is wrong:

announcements = Announcement.objects.all().filter(date_start >= datetime.now())

filter requires Python keyword arguments. So in effect you could:

announcements = Announcement.objects.all().filter(date_start__gte=datetime.now())

More on that on Django docs: Making queries: Field lookups.

Wtower
  • 18,848
  • 11
  • 103
  • 80