Opened 13 years ago
Closed 13 years ago
#20105 closed Uncategorized (invalid)
dictsort by obj and by obj_id gives varying results
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | Template system | Version: | 1.5 |
| Severity: | Normal | Keywords: | dictsort, sorting, grouping, regroup, templatetag |
| Cc: | bmispelon@… | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Hello there.
Story:
I've got a model:
class MyModel(Model): obj = ForeignKey(SomeOtherModel)
I've got a view:
class MyView(ListView):
def get_context_data(self):
return {'objects': MyModel.objects.all()}
Then I've got a template:
{% regroup objects|dictsort:'obj_id' by obj %}
{% regroup objects|dictsort:'obj' by obj %}
And I've got data:
MyModel: [{id: 1, obj: 1},{id: 2, obj: 1},{id: 3, obj: 2},{id: 4, obj: 2},{id: 5, obj: 1}]
SomeOtherModel: [{id: 1},{id: 2}]
Dictsort in first case works well and predictable.
Second case - no way to figure out. One time objects got grouped in 2 groups, as expected. The other time - in 3 groups. The other time - in 4(!) groups.
Guess this behaviour is not meant.
Change History (2)
comment:1 by , 13 years ago
| Cc: | added |
|---|
comment:2 by , 13 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
I'm going to mark this as invalid, since this is not a bug but only a python2 "quirk".
Note:
See TracTickets
for help on using tickets.
Hi,
MyModel.obj_idwill give you back an integer so sorting a list according to this attribute is straightforward and does what you expect.However,
MyModel.objwill give you back an instance ofSomeOtherModel, which causes the behaviour you're describing, because comparing two model instances is somehow undefined (technically, it's very well defined but it most likely never does what you want).The technical reason behind that is that django's models don't implement a
__cmp__method so when comparing them, python falls back to comparing theirid(idbeing the python builtin function, not the primary key of the model) which is not consistent.See
http://docs.python.org/2/reference/datamodel.html#object.__cmp__for more details.Note that this is not applicable to python3 where comparing two model instances together will fail with a
TypeError.