146

I am looking to make a query that selects between dates with Django.

I know how to do this with raw SQL pretty easily, but how could this be achieved using the Django ORM?

This is where I want to add the between dates of 30 days in my query:

start_date = datetime.datetime.now() + datetime.timedelta(-30)
context[self.varname] = self.model._default_manager.filter(
    current_issue__isnull=True
    ).live().order_by('-created_at')

4 Answers 4

291

Use the __range operator:

...filter(current_issue__isnull=True, created_at__range=(start_date, end_date))
Sign up to request clarification or add additional context in comments.

2 Comments

Is the "created_at" an arbitrary field in a model or is this the databases actual log of when the record was created?
@Philip556677 It's an arbitrary field in a model. You can set the DateField's auto_now_add parameter to True in order to have it easily.
26

__range

Comments

7

If you are using a DateTimeField, Filtering with dates won’t include items on the last day.

You need to casts the value as date:

...filter(created_at__date__range=(start_date, end_date))

Comments

3

two methods

.filter(created_at__range=[from_date, to_date])

another method

.filter(Q(created_at__gte=from_date)&Q(created_at__lte=to_date))
  • gte means greater than equal
  • lte means less than equal

1 Comment

Q Objects is unnecessary in the second method, you can write: .filter(created_at__gte=from_date, created_at__lte=to_date)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.