#27828: ORM crash on F('date_field') - F('int_field') on PostgreSQL
-------------------------------------+-------------------------------------
Reporter: Vytis | Owner: nobody
Banaitis |
Type: Bug | Status: new
Component: Database | Version: 1.10
layer (models, ORM) |
Severity: Normal | Keywords:
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
PostgreSQL allows to use subtraction with a date and an int, returning a
date. The integer is taken as a time delta in days.
I was trying to use this in Django.
{{{#!python
class DateModel(models.Model):
date_field = models.DateField()
int_field = models.IntegerField()
}}}
{{{#!python
In [3]: qs =
DateModel.objects.annotate(result=ExpressionWrapper(F('date_field') -
F('int_field'), output_field=DateField()))
}}}
However, this query crashes:
{{{#!python
In [4]: qs.all()
Out[4]:
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call
last)
/home/vytis/src/django/django/db/backends/utils.py in execute(self, sql,
params)
61 else:
---> 62 return self.cursor.execute(sql, params)
63
ProgrammingError: function age(date, integer) does not exist
LINE 1: ...del"."date_field", "myapp_datemodel"."int_field", age("myapp...
^
HINT: No function matches the given name and argument types. You might
need to add explicit type casts.
}}}
Generated SQL:
{{{
SELECT "myapp_datemodel"."id", "myapp_datemodel"."date_field",
"myapp_datemodel"."int_field", age("myapp_datemodel"."date_field",
"myapp_datemodel"."int_field") AS "result" FROM "myapp_datemodel"
}}}
While looking for a solution, I came across a typo in
django/db/models/expressions.py (introduced in
[changeset:"766afc22a1dfa7d34a08de85356b7bc9dba025e7" 766afc22]):
https://github.com/django/django/blob/9718fa2e8abe430c3526a9278dd976443d4ae3c6/django/db/models/expressions.py#L386
Note the `lhs_output` on both sides of operation.
Fixing this typo resolves the crash.
--
Ticket URL: <https://code.djangoproject.com/ticket/27828>
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/049.433349467209f749f240b55df1055acb%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.