#163 closed enhancement (fixed)
Option to leave off __exact
Reported by: | Manuzhai | Owned by: | Adrian Holovaty |
---|---|---|---|
Component: | Template system | Version: | magic-removal |
Severity: | major | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Doing sites.get_object(id__exact = 1)
seems kind of verbose if sites.get_object(id = 1)
would convey the same meaning and be a little easier to read.
Change History (13)
comment:1 by , 19 years ago
comment:2 by , 19 years ago
Description: | modified (diff) |
---|
comment:4 by , 19 years ago
But not if what's implicit is blindingly obvious.
The option of idexact should be kept, but I can't conceive of any other meaning for polls.get_object(id=5)
than id__exact=5
. Beautiful is better than ugly. Simple is better than complex. Readability counts. I'll see your Zen and raise you two more. :-)
comment:5 by , 19 years ago
Argh, should have put triple-braces around that id__exact
. What I meant to say was:
The option of id__exact
should be kept, but I can't conceive of any other meaning for polls.get_object(id=5)
than id__exact=5
.
Beautiful is better than ugly.
Simple is better than complex.
Readability counts.
I'll see your Zen quote and raise you two more. :-)
comment:6 by , 19 years ago
Besides, look at how short the patch is!
Index: django/core/meta.py =================================================================== --- django/core/meta.py (revision 299) +++ django/core/meta.py (working copy) @@ -1142,8 +1147,10 @@ continue lookup_list = kwarg.split(LOOKUP_SEPARATOR) if len(lookup_list) == 1: - _throw_bad_kwarg_error(kwarg) - lookup_type = lookup_list.pop() + # polls.get_object(id=5) is shorthand for polls.get_object(id__exact=5) + lookup_type = 'exact' + else: + lookup_type = lookup_list.pop() current_opts = opts # We'll be overwriting this, so keep a reference to the original opts. current_table_alias = current_opts.db_table param_required = False
Isn't it the cutest patch you've ever seen? It followed me home, Mom, can I please apply it to the repository? :-)
On a serious note: this will only work for lookups that are one "level" of complexity deep, e.g. get_object(id=5). I thought about the possibility of doing choices.get_list(polls__sites__id=5)
instead of choices.get_list(polls__sites__id__exact=5)
and realized no, that wouldn't be a good idea. If you're writing out a relation of this much complexity, it's better to be explicit about the fact that you're doing an exact match. But in the vast majority of cases where you'd want to use the shorthand, you're doing something like get_object(id=5)
.
comment:7 by , 19 years ago
See the discussion on this ticket here: http://loglibrary.com/show_page/view/179?Multiplier=3600&Interval=6&StartTime=1122065878 and the resulting proposal here: http://groups-beta.google.com/group/django-developers/browse_thread/thread/6eb17e5d996ed393/ab1cee3ad60980a7#ab1cee3ad60980a7
Basically: add a magic "pk=" keyword to lookups that would do a "primarykeyfieldexact=whatever" lookup for you.
comment:8 by , 19 years ago
Here's a patch to use the magic "pk=(value)" syntax.
Index: django/core/meta.py =================================================================== --- django/core/meta.py (revision 300) +++ django/core/meta.py (working copy) @@ -1142,7 +1147,12 @@ continue lookup_list = kwarg.split(LOOKUP_SEPARATOR) if len(lookup_list) == 1:I tested against SQLite; - _throw_bad_kwarg_error(kwarg) + if kwarg == 'pk': + # "pk=value" is shorthand for "(primary key)__exact=value" + lookup_list = [opts.pk.name, 'exact'] + else: + # Not shorthand, just a bad kwarg + _throw_bad_kwarg_error(kwarg) lookup_type = lookup_list.pop() current_opts = opts # We'll be overwriting this, so keep a reference to the original opts. current_table_alias = current_opts.db_table
Again, it would be possible to do this at deeper levels, but I think the risk of ambiguity isn't worth the effort saved. Besides, if you're going through one table to get to the next table, you probably don't have an id into the second table anyway.
comment:9 by , 19 years ago
I would like it if sites.get_object(1) would default to using the primary key. I personally think id= is a little verbose myself :)
comment:10 by , 19 years ago
Status: | new → assigned |
---|
comment:11 by , 19 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
comment:12 by , 18 years ago
Component: | Admin interface → Template system |
---|---|
milestone: | → Version 1.0 |
priority: | normal → low |
Severity: | normal → major |
Type: | defect → enhancement |
Version: | → magic-removal |
Okay, so I meant