#26273: Use of @classmethod in queryset can crash manage.py if a model is
changed
------------------------------+--------------------------------------------
Reporter: scoenye | Owner: nobody
Type: Bug | Status: new
Component: | Version: 1.9
Uncategorized |
Severity: Normal | Keywords: classmethod queryset manage.py
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
------------------------------+--------------------------------------------
Starting with
{{{
class Graduation(models.Model):
ceremony_date = models.DateField()
...
@classmethod
def current_graduation(cls):
early = date.today() - timedelta(183)
late = date.today() + timedelta(183)
return cls.objects.get(ceremony_date__gte=early,
ceremony_date__lte=late)
class Graduate(models.Model):
conferral = models.ForeignKey(Graduation)
first_name = models.CharField(max_length = 14)
last_name = models.CharField(max_length = 19)
...
}}}
and
{{{
class TestReport(ListView):
queryset =
Graduate.objects.filter(conferral=Graduation.current_graduation()) \
.order_by("last_name", "first_name")
template_name = "graduation/reports/applicants.html"
context_object_name = "applicants"
}}}
The object is to automatically show the applicants for the next upcoming
graduation. This works like a charm until the Graduation model is
modified:
{{{
class Graduation(models.Model):
ceremony_date = models.DateField()
crash_test = models.CharField(max_length=10)
...
@classmethod
def current_graduation(cls):
early = date.today() - timedelta(183)
late = date.today() + timedelta(183)
return cls.objects.get(ceremony_date__gte=early,
ceremony_date__lte=late)
}}}
At this point
{{{
python manage.py makemigrations
}}}
crashes (and so does pretty much any invocation besides asking for --help)
Full stack trace attached, but the cause appears to be that the entire
application is loaded, triggering execution of the class method. This in
turn ends up asking the database for a column that does not exist yet as
the ORM generates a select including all field names.
Not defining queryset on the ListView and using get_queryset() fixes the
problem, but as I originally got bitten by this when rolling a changeset
out to production, I thought the condition is worth documenting.
--
Ticket URL: <https://code.djangoproject.com/ticket/26273>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/050.a9ce2b6ad02332df855e5cc2ff26167b%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.