Shai has changed my mind. Most uses of the get or none pattern that I've 
used could be replaced by .first(), since it's unlikely there will be 
multiple objects with the kind of query you'd be using with a get. I really 
dislike the get_or_create shortcut syntax, and I don't think a good name 
for get_or_none exists for the manager method.

.get(or=None) (of some description) would be my preference, but even that 
is ugly and confuses the existing API with "special" keywords that aren't 
actually a filter.

So, I take back my +1.

Josh

On Saturday, 15 March 2014 02:01:52 UTC+11, Cal Leeming [Simplicity Media 
Ltd] wrote:
>
> At present, I'd propose implementing it on the manager - the same as 
> `.get()`
>
> I would agree the naming convention does seem out of place, but at the 
> same time, no suitable alternative jumps to mind straight away (any 
> suggestions??)
>
> Cal
>
> On Thu, Mar 13, 2014 at 9:34 PM, Josh Smeaton 
> <[email protected]<javascript:>
> > wrote:
>
>> +1 on get_or_none. It seems to be a pattern that comes up quite a lot in 
>> user code, and I know I've had use for it lots of times. Cal, are you 
>> thinking of having a loose function get_or_none(qs, args, kwargs), or 
>> implementing it directly on the manager? I think it'd make sense to 
>> implement on the manager, but the name doesn't "fit" with the other methods 
>> available, so perhaps it'd be better to match it up with get_or_create as a 
>> simple shortcut.
>>
>> Josh
>>
>>
>> On Friday, 14 March 2014 04:48:16 UTC+11, Cal Leeming [Simplicity Media 
>> Ltd] wrote:
>>
>>> Sorry yes, you're quite right.
>>>
>>> To be clear - the proposed solution in this thread is to make 
>>> `.get_or_none()` work exactly the same as `.get()`, with the only exception 
>>> that None is returned in place of DoesNotExist. All other logic (args, 
>>> kwargs, exceptions etc) stay exactly the same.
>>>
>>> Cal
>>>
>>>
>>> On Thu, Mar 13, 2014 at 5:41 PM, Sean Bleier <[email protected]> wrote:
>>>
>>>> I like the implementation referenced in the SO thread, but I would just 
>>>> point out that `.get_or_none()` should accept both *args and **kwargs. `Q` 
>>>> objects can be passed in as arguments to `.get()` and `.filter()`, so it's 
>>>> only natural to allow that for `.get_or_none()`.
>>>>
>>>>
>>>> On Thu, Mar 13, 2014 at 10:26 AM, Cal Leeming [Simplicity Media Ltd] <
>>>> [email protected]> wrote:
>>>>
>>>>> Just read through all those threads/tickets, here's my conclusion.
>>>>>
>>>>> #2659 was rejected 8 years ago [1] on the basis that it's a "feature 
>>>>> creep", and that it "doesn't offer anything revolutionary". However the 
>>>>> same could be said for .first() and .last(), yet those were accepted.
>>>>>
>>>>> #11352 was rejected by luke plant 2 years ago [4] based on the 
>>>>> suggested implementation in that ticket, which is not the same 
>>>>> implementation as what I'm proposing this time round. The design of 
>>>>> `get_object_or_none` being added into shortcuts is not a good approach, 
>>>>> and 
>>>>> was right to be rejected.
>>>>>
>>>>> #17546 was rejected 2 years ago [3] on the basis that #2659 and #11352 
>>>>> were rejected, both of which I've addressed above.
>>>>>
>>>>> First argument - `first()` and `.last()` have been added, yet the 
>>>>> principle behind why they were added is the same as `.get_or_none()`. 
>>>>> Second argument - The implementation being suggested in this thread is 
>>>>> not the same as what has been suggested in the three rejected tickets.
>>>>> Third argument - Thread [2] had mostly positive feedback, but there 
>>>>> was no BDFL decision specifically on `get_or_none`.
>>>>>
>>>>> If I'm missing something here, please let me know.
>>>>>
>>>>> Cal
>>>>>
>>>>> [1] https://code.djangoproject.com/ticket/2659
>>>>> [2] https://groups.google.com/forum/?fromgroups=#!searchin/
>>>>> django-developers/get_default/django-developers/3RwDxWKPZ_A/
>>>>> mPtAlQ2b0DwJ
>>>>> [3] https://code.djangoproject.com/ticket/17546
>>>>> [4] https://code.djangoproject.com/ticket/11352
>>>>>
>>>>>
>>>>> On Thu, Mar 13, 2014 at 5:05 PM, Shai Berger <[email protected]>wrote:
>>>>>
>>>>>> On Thursday 13 March 2014 18:45:31 Cal Leeming [Simplicity Media Ltd] 
>>>>>> wrote:
>>>>>> > Seems this issue was brought up several years ago, though the 
>>>>>> thread was
>>>>>> > later hijacked for other functionality and get_or_none fizzled out.
>>>>>> > https://groups.google.com/forum/#!topic/django-
>>>>>> developers/Saa5nbzqQ2Q
>>>>>> >
>>>>>> > In Django 1.6 there were convenience methods added for .first(), 
>>>>>> for the
>>>>>> > same principle of not having to catch an IndexError (or in this 
>>>>>> case, a
>>>>>> > DoesNotExist error);
>>>>>> > https://docs.djangoproject.com/en/dev/ref/models/
>>>>>> querysets/#django.db.model
>>>>>> > s.query.QuerySet.first
>>>>>> >
>>>>>> > This seems to be wanted by several users, as seen here;
>>>>>> > http://stackoverflow.com/questions/1512059/django-get-
>>>>>> an-object-form-the-db
>>>>>> > -or-none-if-nothing-matches
>>>>>> >
>>>>>> > Seems to be quite an easy fix, just needs a proper patch.
>>>>>> >
>>>>>> > Any thoughts?
>>>>>> >
>>>>>> You linked the wrong thread.
>>>>>>
>>>>>> https://groups.google.com/forum/?fromgroups=#!searchin/
>>>>>> django-developers/get_default/django-developers/3RwDxWKPZ_A/
>>>>>> mPtAlQ2b0DwJ
>>>>>>
>>>>>> https://groups.google.com/forum/?fromgroups=#!searchin/
>>>>>> django-developers/first%28%29/django-developers/iaOIvwzUhx4/
>>>>>> x5wKtl7Bh2sJ
>>>>>>
>>>>>> I was (and still am) for a get_or_none() that raises an exception when
>>>>>> it finds multiple objects, but we were overruled.
>>>>>>
>>>>>> Shai.
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "Django developers" 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].
>>>>>>
>>>>>> Visit this group at http://groups.google.com/group/django-developers.
>>>>>> To view this discussion on the web visit https://groups.google.com/d/
>>>>>> msgid/django-developers/201403131905.09028.shai%40platonix.com.
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>  -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "Django developers" 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].
>>>>>
>>>>> Visit this group at http://groups.google.com/group/django-developers.
>>>>> To view this discussion on the web visit https://groups.google.com/d/
>>>>> msgid/django-developers/CAHKQagFCyR2GGcY%2BV%2BGzdR%
>>>>> 3DKi3P9%2BTVbT4BzVD_bDoJBN1w6Qw%40mail.gmail.com<https://groups.google.com/d/msgid/django-developers/CAHKQagFCyR2GGcY%2BV%2BGzdR%3DKi3P9%2BTVbT4BzVD_bDoJBN1w6Qw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>  
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Django developers" 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].
>>>>
>>>> Visit this group at http://groups.google.com/group/django-developers.
>>>> To view this discussion on the web visit https://groups.google.com/d/
>>>> msgid/django-developers/CAKFtT_1UhAciOR-OSYW734ftsCRJ6%
>>>> 3DRTiKbhvNktUQVf%3DSHsQg%40mail.gmail.com<https://groups.google.com/d/msgid/django-developers/CAKFtT_1UhAciOR-OSYW734ftsCRJ6%3DRTiKbhvNktUQVf%3DSHsQg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Django developers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to 
>> [email protected]<javascript:>
>> .
>> Visit this group at http://groups.google.com/group/django-developers.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/django-developers/05cbe701-87ec-4e2d-8b62-a5ba4eaf6e16%40googlegroups.com<https://groups.google.com/d/msgid/django-developers/05cbe701-87ec-4e2d-8b62-a5ba4eaf6e16%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" 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].
Visit this group at http://groups.google.com/group/django-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/8c640130-e89b-475b-8049-7562eb195787%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to