diff --git a/django/db/models/manager.py b/django/db/models/manager.py index 1f1f301f94..72bdc4a085 100644 --- a/django/db/models/manager.py +++ b/django/db/models/manager.py @@ -189,18 +189,12 @@ class Manager(object): assert len(obj_list) == 1, "get_object() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.klass._meta.object_name, len(obj_list), kwargs) return obj_list[0] - def get_in_bulk(self, *args, **kwargs): - # Separate any list arguments: the first list will be used as the id list; subsequent - # lists will be ignored. - id_args = filter(lambda arg: isinstance(arg, list), args) - # Separate any non-list arguments: these are assumed to be query arguments - sql_args = filter(lambda arg: not isinstance(arg, list), args) - - id_list = id_args and id_args[0] or kwargs.get('id_list', []) + def get_in_bulk(self, id_list, *args, **kwargs): + assert isinstance(id_list, list), "get_in_bulk() must be provided with a list of IDs." assert id_list != [], "get_in_bulk() cannot be passed an empty ID list." kwargs['where'] = ["%s.%s IN (%s)" % (backend.quote_name(self.klass._meta.db_table), backend.quote_name(self.klass._meta.pk.column), ",".join(['%s'] * len(id_list)))] kwargs['params'] = id_list - obj_list = self.get_list(*sql_args, **kwargs) + obj_list = self.get_list(*args, **kwargs) return dict([(getattr(o, self.klass._meta.pk.attname), o) for o in obj_list]) def get_values_iterator(self, *args, **kwargs): @@ -233,14 +227,8 @@ class Manager(object): kwargs['limit'] = 1 return self.get_object(*args, **kwargs) - def __get_date_list(self, field, *args, **kwargs): - # Separate any string arguments: the first will be used as the kind - kind_args = filter(lambda arg: isinstance(arg, str), args) - # Separate any non-list arguments: these are assumed to be query arguments - sql_args = filter(lambda arg: not isinstance(arg, str), args) - + def __get_date_list(self, field, kind, *args, **kwargs): from django.db.backends.util import typecast_timestamp - kind = kind_args and kind_args[0] or kwargs.get(['kind'],"") assert kind in ("month", "year", "day"), "'kind' must be one of 'year', 'month' or 'day'." order = 'ASC' if kwargs.has_key('order'): @@ -251,7 +239,7 @@ class Manager(object): if field.null: kwargs.setdefault('where', []).append('%s.%s IS NOT NULL' % \ (backend.quote_name(self.klass._meta.db_table), backend.quote_name(field.column))) - select, sql, params = self._get_sql_clause(*sql_args, **kwargs) + select, sql, params = self._get_sql_clause(*args, **kwargs) sql = 'SELECT %s %s GROUP BY 1 ORDER BY 1 %s' % \ (backend.get_date_trunc_sql(kind, '%s.%s' % (backend.quote_name(self.klass._meta.db_table), backend.quote_name(field.column))), sql, order) diff --git a/tests/modeltests/basic/models.py b/tests/modeltests/basic/models.py index 70a6ac61d2..8e6e52693a 100644 --- a/tests/modeltests/basic/models.py +++ b/tests/modeltests/basic/models.py @@ -180,6 +180,17 @@ False >>> Article.objects.get_pub_date_list('day', order='DESC') [datetime.datetime(2005, 7, 31, 0, 0), datetime.datetime(2005, 7, 30, 0, 0), datetime.datetime(2005, 7, 29, 0, 0), datetime.datetime(2005, 7, 28, 0, 0)] +# Try some bad arguments to __get_date_list +>>> Article.objects.get_pub_date_list('badarg') +Traceback (most recent call last): + ... +AssertionError: 'kind' must be one of 'year', 'month' or 'day'. +>>> Article.objects.get_pub_date_list(order='ASC') +Traceback (most recent call last): + ... +TypeError: __get_date_list() takes at least 3 non-keyword arguments (2 given) + + # An Article instance doesn't have access to the "objects" attribute. # That is only available as a class method. >>> a7.objects.get_list() diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py index dcc0b3a826..6434b8cd48 100644 --- a/tests/modeltests/lookup/models.py +++ b/tests/modeltests/lookup/models.py @@ -69,6 +69,18 @@ Article 4 Traceback (most recent call last): ... AssertionError: get_in_bulk() cannot be passed an empty ID list. +>>> Article.objects.get_in_bulk('foo') +Traceback (most recent call last): + ... +AssertionError: get_in_bulk() must be provided with a list of IDs. +>>> Article.objects.get_in_bulk() +Traceback (most recent call last): + ... +TypeError: get_in_bulk() takes at least 2 arguments (1 given) +>>> Article.objects.get_in_bulk(headline__startswith='Blah') +Traceback (most recent call last): + ... +TypeError: get_in_bulk() takes at least 2 non-keyword arguments (1 given) # get_values() is just like get_list(), except it returns a list of # dictionaries instead of object instances -- and you can specify which fields