Agon
11:45 23-07-2009 Django.models.object.get()
Играюсь с Django. Заметил, что при вызове Model.objects.get(pk=key) в случае, если в таблице вызываемый ключ отсутствует, поднимается исключение DoesNotExist, в то время как Model.objects.filter(pk=key) такого исключения не поднимает никогда. При этом, если посмотреть в коде, то сразу выясняется, что:

    def get(self, *args, **kwargs):
        """
        Performs the query and returns a single object matching the given
        keyword arguments.
        """
        clone = self.filter(*args, **kwargs)
        num = len(clone)
        if num == 1:
            return clone._result_cache[0]
        if not num:
            raise self.model.DoesNotExist("%s matching query does not exist."
                    % self.model._meta.object_name)
        raise self.model.MultipleObjectsReturned("get() returned more than one \
%s -- it returned %s! Lookup parameters were %s"
                % (self.model._meta.object_name, num, kwargs))


Т.е. get() - это просто алиас для filter(), который пытается вернуть первый элемент массива, а в случае если его нет - поднимает тот самый DoesNotExist. Из этого следует, что get() стоит использовать только в случае, если вы уверены что заданый ключ в базе есть, или если его отсутствие - это исключение, которое вы будете обрабатывать с try-except (хотя в последнем случае проще использовать get_object_or_404() или что-то вроде него). Во всех остальных случаях проще выполнить filter() и проверить len() самому. Хотя, возможно, я посто не привык использовать try-except - я стараюсь просто не допускать ситуаций при которых исключения могут возникнуть, сказывается PHP-наследие.