summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorGary Wilson Jr <gary.wilson@gmail.com>2008-08-16 20:59:06 +0000
committerGary Wilson Jr <gary.wilson@gmail.com>2008-08-16 20:59:06 +0000
commita949f9ec7d8bdd348f628c2d579f4cc633c56e56 (patch)
tree98930e4bcf3b5920e516b176b924c6bacdeef2a1 /django
parenta2be52fd2a27b5a39744939c906cd57507aa8f10 (diff)
Fixed #3121 -- Made `get_or_create()` work for `RelatedManager` and `ManyRelatedManager`.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8415 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/db/models/fields/related.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index e90c54df4e..e2c78ef96b 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -311,6 +311,13 @@ class ForeignRelatedObjectsDescriptor(object):
return new_obj
create.alters_data = True
+ def get_or_create(self, **kwargs):
+ # Update kwargs with the related object that this
+ # ForeignRelatedObjectsDescriptor knows about.
+ kwargs.update({rel_field.name: instance})
+ return super(RelatedManager, self).get_or_create(**kwargs)
+ get_or_create.alters_data = True
+
# remove() and clear() are only provided if the ForeignKey can have a value of null.
if rel_field.null:
def remove(self, *objs):
@@ -409,6 +416,16 @@ def create_many_related_manager(superclass, through=False):
return new_obj
create.alters_data = True
+ def get_or_create(self, **kwargs):
+ obj, created = \
+ super(ManyRelatedManager, self).get_or_create(**kwargs)
+ # We only need to add() if created because if we got an object back
+ # from get() then the relationship already exists.
+ if created:
+ self.add(obj)
+ return obj, created
+ get_or_create.alters_data = True
+
def _add_items(self, source_col_name, target_col_name, *objs):
# join_table: name of the m2m link table
# source_col_name: the PK colname in join_table for the source object