Opened 13 years ago
Last modified 11 years ago
#18375 closed Bug
F() doesn't work as expected across relations — at Initial Version
Reported by: | FunkyBob | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.4 |
Severity: | Release blocker | Keywords: | |
Cc: | German M. Bravo | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When trying to compare a field to another on the same related record, F() will compare against a separate alias of the table, thus not guaranteeing filtering against the same row.
There doesn't appear to be anything in the docs or tests to indicate what the 'correct' behavior is. Also, there's no apparent way to control it.
Using the attached models, I get the following:
(InteractiveConsole) >>> from sample import models >>> from django.db.models import Q, F >>> qset = models.Uber.objects.filter(unter__available__gt=F('unter__used')) >>> str(qset.query) 'SELECT "sample_uber"."id", "sample_uber"."title" FROM "sample_uber" INNER JOIN "sample_unter" ON ("sample_uber"."id" = "sample_unter"."uber_id") INNER JOIN "sample_unter" T3 ON ("sample_uber"."id" = T3."uber_id") WHERE T3."available" > "sample_unter"."used"'
The SQL nicely formatted shows:
SELECT "sample_uber"."id", "sample_uber"."title" FROM "sample_uber" INNER JOIN "sample_unter" ON ("sample_uber"."id" = "sample_unter"."uber_id") INNER JOIN "sample_unter" T3 ON ("sample_uber"."id" = T3."uber_id") WHERE T3."available" > "sample_unter"."used"
So, the F('unterused') is using the 'sample_unter' join, whereas the unteravailablegt is using the T3 alias.