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.
