Opened 16 years ago
Closed 13 years ago
#13400 closed Bug (duplicate)
model.DoesNotExist exception raised by QuerySet.get() should include the same nice description of parameters that the MultipleObjectsReturned exception does.
| Reported by: | aaron | Owned by: | trentm |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | |
| Severity: | Normal | Keywords: | model.DoesNotExist, ObjectDoesNotExist, QuerySet.get error message kwargs parameters |
| Cc: | asokoloski@…, Anders Hovmöller | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | yes |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
The current message contained in a DoesNotExist (ObjectDoesNotExist) exception raised by QuerySet.get(...) is roughly:
"%s matching query does not exist." % MODEL_NAME
But the MultipleObjectsReturned exception raised by the same function looks like:
"get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (MODEL_NAME, NUMBER_OF_OBJECTS, KWARGS)
with KWARGS being the keyword arguments passed to the get(...) method. This is great for investigating error message emails sent from a live site -- it makes it really easy to find out which object you were trying to get, and how to fix the root cause.
I suggest that the DoesNotExist error message would benefit from the same descriptiveness. I am attaching a patch that adds this information to the model.DoesNotExist exception.
Attachments (3)
Change History (19)
by , 16 years ago
| Attachment: | 13400-better-doesnotexist-error-message.diff added |
|---|
comment:1 by , 16 years ago
| Has patch: | set |
|---|
comment:2 by , 16 years ago
| Needs tests: | set |
|---|---|
| Triage Stage: | Unreviewed → Accepted |
A reasonable suggestion. However the patch needs work - in particular, this change will break several existing doctests that are relying on the current wording of the error.
by , 16 years ago
| Attachment: | 13400-better-doesnotexist-error-message-tests-fixed.diff added |
|---|
Same as previous patch, but with tests fixed.
comment:3 by , 16 years ago
The format of the message I came up with was, e.g.:
DoesNotExist: User matching query (
id__exact=2L) does not exist.
The patch for that (without the patch for the test cases) is:
Index: django/db/models/query.py
===================================================================
--- django/db/models/query.py (revision 13020)
+++ django/db/models/query.py (working copy)
@@ -301,8 +301,9 @@
if num == 1:
return clone._result_cache[0]
if not num:
- raise self.model.DoesNotExist("%s matching query does not exist."
- % self.model._meta.object_name)
+ q = ', '.join([repr(a) for a in args] + ["%s=%r" % i for i in kwargs.items()])
+ raise self.model.DoesNotExist(u"%s matching query (`%s`) does not exist."
+ % (self.model._meta.object_name, q))
raise self.model.MultipleObjectsReturned("get() returned more than one %s -- it returned %s! Lookup parameters were %s"
% (self.model._meta.object_name, num, kwargs))
If others preferred that wording, then I could make a patch along with the test case updates.
Pros:
- My patch includes the "args" in the formatting, tho I don't really know if the 'args' are ever non-empty
Cons:
- Construction of the error string in my patch is slightly more computationally expensive.
comment:4 by , 16 years ago
That example string in last message should be (wiki formatting error of mine):
DoesNotExist: User matching query (`id__exact=2L`) does not exist.
comment:6 by , 16 years ago
| Cc: | added |
|---|
by , 16 years ago
| Attachment: | 13400-alt-doesnotexist-error-message.diff added |
|---|
My alternative improved DoesNotExist error message patch (with updates for tests)
comment:7 by , 16 years ago
| Needs documentation: | set |
|---|---|
| Needs tests: | unset |
Note to self: there are a couple examples of this traceback in the docs that should probably be added to the patch.
comment:8 by , 16 years ago
| Owner: | changed from to |
|---|
Trentm, I'm going to assign this to you now since you're the one working on it. Thanks.
comment:9 by , 16 years ago
| Patch needs improvement: | set |
|---|
Noting that patch needs improvement, as per Trentm
comment:10 by , 15 years ago
| Severity: | → Normal |
|---|---|
| Type: | → Bug |
comment:13 by , 13 years ago
Is anyone gonna integrate this? Such a simple fix that improves usability so much seems like a no brainer to me.
comment:14 by , 13 years ago
| Cc: | added |
|---|
comment:15 by , 13 years ago
@boxed: Yes, the idea is a no brainer. That's why the ticket was accepted. However, the fact that the idea is a no-brainer doesn't change the fact that the ticket is marked as needing improvement. That means we need someone to fix the patch, and we need someone else to review that updated patch and mark the ticket as ready for checkin.
You don't need to have special permission to do either of these things -- we just need a cleanly applying patch, addressing all the issues raised, that has been vetted by two people independently. Once it's marked ready for checkin, the core team will commit it (or bump it back to needs improvement, with more comments).
comment:16 by , 13 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |
This was a duplicate of #10494 which was fixed in d5b93d3281fe93cbef5de84a52001f64dbd839bd
Patch to give better error message when QuerySet.get(...) raises model.DoesNotExist