Sefa
Sefa

Reputation: 8992

How to filter objects on datetime fields?

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.

Upvotes: 3

Views: 934

Answers (2)

Wtower
Wtower

Reputation: 19922

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.

Upvotes: 3

Matt Seymour
Matt Seymour

Reputation: 9415

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

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

Upvotes: 4

Related Questions