On Fri, Mar 14, 2014 at 3:08 PM, Josh Smeaton <[email protected]>wrote:

> 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.
>

The keyword here is `unlikely`. As mentioned in the other email, using
`first()` on the assumption that there is only one item, without doing an
assertion check, can lead to unexpected behaviour.

The use case for `first()` is not the same as the use case for
`get_or_none()`, but the principle of why they should be there is the same.


> 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.
>

I would agree the name `get_or_none` does feel a little odd, but still
struggling to think of an alternative.


>
> .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.
>

I would be strong -1 on having a special keyword.


>
> 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]>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/d
>>>>>> jango-developers/get_default/django-developers/3RwDxWKPZ_A/m
>>>>>> PtAlQ2b0DwJ
>>>>>> [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/djang
>>>>>>> o-developers/get_default/django-developers/3RwDxWKPZ_A/mPtAlQ2b0DwJ
>>>>>>>
>>>>>>> https://groups.google.com/forum/?fromgroups=#!searchin/djang
>>>>>>> o-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/20140313
>>>>>>> 1905.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%3DRTiK
>>>>> bhvNktUQVf%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].
>>> 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/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<https://groups.google.com/d/msgid/django-developers/8c640130-e89b-475b-8049-7562eb195787%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/CAHKQagH4FFGyvH9-gCzSyiHtiGmJzthr7tjjWDqnJkqMOH%2BYRw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to