On 12/18/06, Waylan Limberg <[EMAIL PROTECTED]> wrote: > > On 12/18/06, Gary Wilson <[EMAIL PROTECTED]> wrote: > > > > I often find myself writing code like: > > > > try: > > user = User.objects.get(pk=user_id) > > except User.DoesNotExist: > > user = None > > > > What do you think about adding a get_or_none QuerySet method? > > > > def get_or_none(self, **kwargs): > > try: > > return self.get(**kwargs) > > except self.model.DoesNotExist: > > return None > > > > Or how about using something similar to QuearyDict's get(key, > default)? That way the fallback is not restricted to `None`. So > something like this: > > user = User.objects.get(pk=user_id, default=None) > > Of course, I think that would probably be significantly more work than > your little wrapper function.
note neccessarily (beware, quick&ugly proof of concept): Index: django/db/models/query.py =================================================================== --- django/db/models/query.py (revision 4227) +++ django/db/models/query.py (working copy) @@ -12,6 +12,8 @@ # The string constant used to separate query parts LOOKUP_SEPARATOR = '__' +# for get(default) +NOT_SET='WHATEVER' # The list of valid query types QUERY_TERMS = ( @@ -202,7 +204,8 @@ cursor.execute("SELECT COUNT(*)" + sql, params) return cursor.fetchone()[0] - def get(self, *args, **kwargs): + + def get(self, default=NOT_SET, *args, **kwargs): "Performs the SELECT and returns a single object matching the given keyword arguments." clone = self.filter(*args, **kwargs) # clean up SQL by removing unneeded ORDER BY @@ -210,6 +213,8 @@ clone._order_by = () obj_list = list(clone) if len(obj_list) < 1: + if default != NOT_SET: + return default raise self.model.DoesNotExist, "%s matching query does not exist." % self.model._meta.object_name assert len(obj_list) == 1, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.model._meta.object_name, len(obj_list), kwargs) return obj_list[0] > -- > ---- > Waylan Limberg > [EMAIL PROTECTED] > > > > -- Honza Král E-Mail: [EMAIL PROTECTED] ICQ#: 107471613 Phone: +420 606 678585 --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-developers?hl=en -~----------~----~----~----~------~----~------~--~---