diff options
| author | Adrian Holovaty <adrian@holovaty.com> | 2006-06-07 00:09:29 +0000 |
|---|---|---|
| committer | Adrian Holovaty <adrian@holovaty.com> | 2006-06-07 00:09:29 +0000 |
| commit | b3a6348bc24de6dc7168e6c00f2d2d440b1fe748 (patch) | |
| tree | 573223e5b6077b6c7455dcae179025489894c298 /django | |
| parent | 7e88ec527107bd2c9023d48bcf177636eebc7e7a (diff) | |
Added Manager.get_or_create()
git-svn-id: http://code.djangoproject.com/svn/django/trunk@3092 bcc190cf-cafb-0310-a4f2-bffc1f526a37
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' |
