Re: Weird inconsistencies for same queryset in different Django instances
On Tue, May 11, 2010 at 8:27 PM, Daniel Rosemanwrote: > On May 11, 7:08 pm, Malcolm Box wrote: > > Hi, > > > > I've run into a weird bug that has me scratching my head - I'm seeing > > inconsistent results from a queryset between various apache processes and > > the django shell. I.e. sometimes a GET gives me the right response (as > it > > hits a "correct" Apache instance) and other times it gives a wrong > > response. Restarting Apache causes problem to go away, but it resurfaces > > later. > > > > I have a Poll class which has a start_time and an end_time, both of which > > are optional, plus an enabled field. A poll is considered active if it's > > enabled, and if it has a start_time then now > start_time, and if it has > an > > end_time then now < end_time. > > > > What I'm seeing is that sometimes polls with a start_time that is before > now > > are not showing up in the responses when I do a series of GETs. So e.g. > > first GET - shows poll, second one - doesn't show, third - doesn't, > fourth - > > does and so on. > > > > From a fresh python shell, the Poll.objects.active() call always gives > the > > right results. > > > > The code in question is: > > > > class PollManager(models.Manager): > > def active(self): > > qs = super(PollManager, > self).get_query_set().filter(enabled=True) > > q_start = Q(start_time__isnull=True) | > > Q(start_time__lte=datetime.datetime.now()) > > q_end = Q(end_time__isnull=True) | > > Q(end_time__gte=datetime.datetime.now()) > > return qs.filter(q_start,q_end) > > > > Where the models are is: > > > > class Event(models.Model): > >enabled = models.BooleanField() # automatic default false > > other fields > > > > class Poll(models.Model): > > event = models.ForeignKey(Event, db_index=True) > > enabled = models.BooleanField() # automatic default false > > start_time = models.DateTimeField(blank=True, null=True, > help_text="Time > > to enable this poll (optional)") > > end_time = models.DateTimeField(blank=True, null=True, > help_text="Time > > to close this poll (optional)") > > > > objects = PollManager() > > > > The view logic is basically: > > > > def view_polls(request, event_id): > > filtered_set = self.queryset._clone()# Queryset is > > Poll.objects.active().filter(event__enabled = True) > > filtered_set = filtered_set.filter(event__id=event_id) > > return render_to_response(template, filtered_set) > > > > (this has been elided and adapted - original code is using > django-rest-api, > > JSON responder etc. But the call boils down to this) > > > > I'm confused as to what the problem could be - any clues? > > > > Cheers, > > > > Malcolm > > I'd like to see how the queryset is assigned to `self`. My suspicion > would be that the arguments are being preserved across requests - when > it's first instantiated, it correctly uses the current time to filter, > but on subsequent calls it is still using the time as of the first > request. > The queryset is being initialised in the construction of a callable which is then used for the view. So yes, it probably is only being initialised once on server startup. Thank you! Still testing the fix, but I think this will fix it. Cheers, Malcolm -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
Re: Weird inconsistencies for same queryset in different Django instances
On May 11, 7:08 pm, Malcolm Boxwrote: > Hi, > > I've run into a weird bug that has me scratching my head - I'm seeing > inconsistent results from a queryset between various apache processes and > the django shell. I.e. sometimes a GET gives me the right response (as it > hits a "correct" Apache instance) and other times it gives a wrong > response. Restarting Apache causes problem to go away, but it resurfaces > later. > > I have a Poll class which has a start_time and an end_time, both of which > are optional, plus an enabled field. A poll is considered active if it's > enabled, and if it has a start_time then now > start_time, and if it has an > end_time then now < end_time. > > What I'm seeing is that sometimes polls with a start_time that is before now > are not showing up in the responses when I do a series of GETs. So e.g. > first GET - shows poll, second one - doesn't show, third - doesn't, fourth - > does and so on. > > From a fresh python shell, the Poll.objects.active() call always gives the > right results. > > The code in question is: > > class PollManager(models.Manager): > def active(self): > qs = super(PollManager, self).get_query_set().filter(enabled=True) > q_start = Q(start_time__isnull=True) | > Q(start_time__lte=datetime.datetime.now()) > q_end = Q(end_time__isnull=True) | > Q(end_time__gte=datetime.datetime.now()) > return qs.filter(q_start,q_end) > > Where the models are is: > > class Event(models.Model): > enabled = models.BooleanField() # automatic default false > other fields > > class Poll(models.Model): > event = models.ForeignKey(Event, db_index=True) > enabled = models.BooleanField() # automatic default false > start_time = models.DateTimeField(blank=True, null=True, help_text="Time > to enable this poll (optional)") > end_time = models.DateTimeField(blank=True, null=True, help_text="Time > to close this poll (optional)") > > objects = PollManager() > > The view logic is basically: > > def view_polls(request, event_id): > filtered_set = self.queryset._clone() # Queryset is > Poll.objects.active().filter(event__enabled = True) > filtered_set = filtered_set.filter(event__id=event_id) > return render_to_response(template, filtered_set) > > (this has been elided and adapted - original code is using django-rest-api, > JSON responder etc. But the call boils down to this) > > I'm confused as to what the problem could be - any clues? > > Cheers, > > Malcolm I'd like to see how the queryset is assigned to `self`. My suspicion would be that the arguments are being preserved across requests - when it's first instantiated, it correctly uses the current time to filter, but on subsequent calls it is still using the time as of the first request. -- DR. -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
Re: Weird inconsistencies for same queryset in different Django instances
Change your "datetime.now()"s in your manager to "datetime.now"s. The callable version will be called every time, rather than only once at the start of the process. Regards Scott On May 11, 2:08 pm, Malcolm Boxwrote: > Hi, > > I've run into a weird bug that has me scratching my head - I'm seeing > inconsistent results from a queryset between various apache processes and > the django shell. I.e. sometimes a GET gives me the right response (as it > hits a "correct" Apache instance) and other times it gives a wrong > response. Restarting Apache causes problem to go away, but it resurfaces > later. > > I have a Poll class which has a start_time and an end_time, both of which > are optional, plus an enabled field. A poll is considered active if it's > enabled, and if it has a start_time then now > start_time, and if it has an > end_time then now < end_time. > > What I'm seeing is that sometimes polls with a start_time that is before now > are not showing up in the responses when I do a series of GETs. So e.g. > first GET - shows poll, second one - doesn't show, third - doesn't, fourth - > does and so on. > > From a fresh python shell, the Poll.objects.active() call always gives the > right results. > > The code in question is: > > class PollManager(models.Manager): > def active(self): > qs = super(PollManager, self).get_query_set().filter(enabled=True) > q_start = Q(start_time__isnull=True) | > Q(start_time__lte=datetime.datetime.now()) > q_end = Q(end_time__isnull=True) | > Q(end_time__gte=datetime.datetime.now()) > return qs.filter(q_start,q_end) > > Where the models are is: > > class Event(models.Model): > enabled = models.BooleanField() # automatic default false > other fields > > class Poll(models.Model): > event = models.ForeignKey(Event, db_index=True) > enabled = models.BooleanField() # automatic default false > start_time = models.DateTimeField(blank=True, null=True, help_text="Time > to enable this poll (optional)") > end_time = models.DateTimeField(blank=True, null=True, help_text="Time > to close this poll (optional)") > > objects = PollManager() > > The view logic is basically: > > def view_polls(request, event_id): > filtered_set = self.queryset._clone() # Queryset is > Poll.objects.active().filter(event__enabled = True) > filtered_set = filtered_set.filter(event__id=event_id) > return render_to_response(template, filtered_set) > > (this has been elided and adapted - original code is using django-rest-api, > JSON responder etc. But the call boils down to this) > > I'm confused as to what the problem could be - any clues? > > Cheers, > > Malcolm > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To post to this group, send email to django-us...@googlegroups.com. > To unsubscribe from this group, send email to > django-users+unsubscr...@googlegroups.com. > For more options, visit this group > athttp://groups.google.com/group/django-users?hl=en. -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
Weird inconsistencies for same queryset in different Django instances
Hi, I've run into a weird bug that has me scratching my head - I'm seeing inconsistent results from a queryset between various apache processes and the django shell. I.e. sometimes a GET gives me the right response (as it hits a "correct" Apache instance) and other times it gives a wrong response. Restarting Apache causes problem to go away, but it resurfaces later. I have a Poll class which has a start_time and an end_time, both of which are optional, plus an enabled field. A poll is considered active if it's enabled, and if it has a start_time then now > start_time, and if it has an end_time then now < end_time. What I'm seeing is that sometimes polls with a start_time that is before now are not showing up in the responses when I do a series of GETs. So e.g. first GET - shows poll, second one - doesn't show, third - doesn't, fourth - does and so on. >From a fresh python shell, the Poll.objects.active() call always gives the right results. The code in question is: class PollManager(models.Manager): def active(self): qs = super(PollManager, self).get_query_set().filter(enabled=True) q_start = Q(start_time__isnull=True) | Q(start_time__lte=datetime.datetime.now()) q_end = Q(end_time__isnull=True) | Q(end_time__gte=datetime.datetime.now()) return qs.filter(q_start,q_end) Where the models are is: class Event(models.Model): enabled = models.BooleanField() # automatic default false other fields class Poll(models.Model): event = models.ForeignKey(Event, db_index=True) enabled = models.BooleanField() # automatic default false start_time = models.DateTimeField(blank=True, null=True, help_text="Time to enable this poll (optional)") end_time = models.DateTimeField(blank=True, null=True, help_text="Time to close this poll (optional)") objects = PollManager() The view logic is basically: def view_polls(request, event_id): filtered_set = self.queryset._clone()# Queryset is Poll.objects.active().filter(event__enabled = True) filtered_set = filtered_set.filter(event__id=event_id) return render_to_response(template, filtered_set) (this has been elided and adapted - original code is using django-rest-api, JSON responder etc. But the call boils down to this) I'm confused as to what the problem could be - any clues? Cheers, Malcolm -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.