Only is a different purpose than first, and as such it would make sense to me if it was a separate method. First has some implication that there may be second, third as well. It comes down to taste, but I think my buds would prefer a separate method.
Ryan — Sent from Mailbox for iPhone On Thu, May 16, 2013 at 12:08 AM, Shai Berger <[email protected]> wrote: > Two notes: > 1) I think it is better to leave the *args, **kw on the manager methods; > since > they are just forwarding to the qset anyways, there's no harm in that, and it > makes them more "future proof" (i.e. you wouldn't need to change them next > time you change the interface of the qset methods). > Case in point: > 2) I'd like to add an argument to the first() method, something like > def first(self, only=True): > Where the sense of only=True is that if there is more than one object to get, > that's an error (MultipleObjects, like in get). > As this feature was mainly designed to replace the anti-pattern, > try: > x = qset.get(...) > except DoesNotExist > x = None > I think the default for "only" should indeed be True. Other people may > disagree. I think without at least the ability to set only=True, this feature > is essentially broken -- since it is the equivalent of > try: > x = qset[0] > except IndexError > x = None > it encourages people to give up an integrity check. > My 2 cents, > Shai. > On Wednesday 15 May 2013, Selwin Ong wrote: >> I've updated the first() and last() to not accept any arguments. Please >> review it and let me know if there's anything else I need to change. >> Hopefully this can get merged in during the sprints and make it into 1.6 >> :). >> >> The pull request is here: https://github.com/django/django/pull/1056 >> >> Best, >> Selwin >> >> On Monday, May 13, 2013 8:12:35 PM UTC+7, Michal Petrucha wrote: >> > > > I initially modeled "first()" and "last()"'s behaviors to mimic >> > > > "latest()", but in this new pull request, you can pass multiple field >> > >> > names >> > >> > > > into "first()" and "last()" so it behaves like "order_by()". It's >> > > > more flexible and requires less typing, but I wonder if we should >> > > > just get >> > >> > rid >> > >> > > > of the optional field arguments and rely on "order_by" for ordering. >> > >> > "There >> > >> > > > should be one-- and preferably only one --obvious way to do it". >> > > >> > > Considering "There should be one-- and preferably only one --obvious >> > > way >> > >> > to >> > >> > > do it", I definitely prefer to rely on order_by to do the ordering, not >> > >> > on >> > >> > > first. >> > > >> > > .order_by('name').first() >> > > >> > > is clear and readable in my opinion. >> > >> > My thoughts exactly, we already have one method that does ordering, I >> > don't think it is necessary to make these methods incorporate that >> > functionality. If we did, we might argue that other QuerySet >> > operations could be supported as well and that would just result in a >> > bloated API. Especially if there's no performance gain (the QuerySet >> > would be cloned anyway), and it only saves a few lines of code. >> > >> > Also, skimming through this thread, I think there was a consensus on >> > first() and last() not taking any ordering arguments, i.e. the first >> > >> > proposed syntax: >> > .filter(last_name__startswith='b').order_by('last_name').first() >> > >> > Michal > -- > 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?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. -- 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?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
