python - Can I filter users to require a matching entry on every date in a given range? -
is possible filter queryset in such way retrieve users don't have matching object every date in range?
for example, have shift
model includes foreignkey
field pointing employee
object , date_requested
datefield
indicating date of shift. i've created following query grabbing user doesn't have shift between, say, 2015-07-19
, 2015-07-25
:
employee.objects.all().exclude( shift__date_requested__gte=datetime.date(2015, 7, 19), shift__date_requested__lte=datetime.date(2015, 7, 25))
unfortunately queryset doesn't catch user has specified shifts 07/19 through 07/24, not 1 07/25. possible further refine query say, "the number of shifts associated user between 2015-07-19
, 2015-07-25
(inclusive) must equal number of days within time frame?
edit: here's code ran according 1 of answers below:
first, dataset showing employee #10 has shift
on every day between 7/19 7/25. should lead them being filtered out:
and filtering code
e = employee.objects.all() print('all employees:\n{0}'.format(e)) day in range(19, 26): print('filtering day {0}'.format(day)) e.filter(shift__date_requested=datetime.date(2015, 7, day)) print('filtered employees:\n{0}'.format(e))
and resulting output:
all employees: [<employee: 12: ereiner@test.com ()>, <employee: 10: alufson@test.com ()>, <employee: 11: tjones@test.com ()>, <employee: 14: wmcgee@test.com ()>, <employee: 13: wcarver@test.com ()>] filtering day 19 filtering day 20 filtering day 21 filtering day 22 filtering day 23 filtering day 24 filtering day 25 filtered employees: [<employee: 12: ereiner@test.com ()>, <employee: 10: alufson@test.com ()>, <employee: 11: tjones@test.com ()>, <employee: 14: wmcgee@test.com ()>, <employee: 13: wcarver@test.com ()>]
as can see, employee 10 isn't being filtered out. tried swapping out filter()
exclude()
saw same result
if you're looking queryset of employees not have shift each , every 1 of given dates:
employees = employee.objects.all() day in range(19, 26): employees = employees.filter(shift__date_requested=datetime.date(2015, 7, day))
note chaining filters does not hit database multiple times.
Comments
Post a Comment