diff options
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/manager.py | 3 | ||||
| -rw-r--r-- | django/db/models/query.py | 17 |
2 files changed, 20 insertions, 0 deletions
diff --git a/django/db/models/manager.py b/django/db/models/manager.py index 93de4a6adc..bfd2effd7f 100644 --- a/django/db/models/manager.py +++ b/django/db/models/manager.py @@ -65,6 +65,9 @@ class Manager(object): def get(self, *args, **kwargs): return self.get_query_set().get(*args, **kwargs) + def get_or_create(self, *args, **kwargs): + return self.get_query_set().get_or_create(*args, **kwargs) + def filter(self, *args, **kwargs): return self.get_query_set().filter(*args, **kwargs) diff --git a/django/db/models/query.py b/django/db/models/query.py index 4bd9b3b9fe..bd5c010658 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -205,6 +205,23 @@ class QuerySet(object): 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] + def get_or_create(self, **kwargs): + """ + Looks up an object with the given kwargs, creating one if necessary. + Returns a tuple of (object, created), where created is a boolean + specifying whether an object was created. + """ + assert len(kwargs), 'get_or_create() must be passed at least one keyword argument' + defaults = kwargs.pop('defaults', {}) + try: + return self.get(**kwargs), False + except self.model.DoesNotExist: + params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) + params.update(defaults) + obj = self.model(**params) + obj.save() + return obj, True + def latest(self, field_name=None): """ Returns the latest object, according to the model's 'get_latest_by' |
