diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index a7b5378623..e016ced3c0 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -117,6 +117,7 @@ class ManyRelatedObjectsDescriptor(object): manager.core_filters.update({'%s__%s__exact' % (rel_field.name, rel_field.rel.to._meta.pk.name): getattr(instance, rel_field.rel.get_related_field().attname)}) else: manager.core_filters.update({'%s__%s__exact' % (rel_field.name, instance_type._meta.pk.name): instance._get_pk_val()}) + manager.core_values = {rel_field.name: instance} # Prepare the manager. # TODO: Fix this hack? diff --git a/django/db/models/manager.py b/django/db/models/manager.py index 662e342af6..70274e2611 100644 --- a/django/db/models/manager.py +++ b/django/db/models/manager.py @@ -24,6 +24,11 @@ class Manager(QuerySet): # Tracks each time a Manager instance is created. Used to retain order. creation_counter = 0 + # Dictionary of field_name -> field_value that will always be used in add(). + # For example, if this is {'name': 'adrian'}, each object created by add() will + # have name='adrian'. + core_values = {} + def __init__(self): super(Manager, self).__init__() # Increase the creation counter, and save our local copy. @@ -48,6 +53,13 @@ class Manager(QuerySet): kwargs['limit'] = 1 return self.get_object(*args, **kwargs) + def add(self, **kwargs): + kwargs.update(self.core_values) + new_obj = self.klass(**kwargs) + new_obj.save() + return new_obj + add.alters_data = True + class ManagerDescriptor(object): # This class ensures managers aren't accessible via model instances. # For example, Poll.objects works, but poll_obj.objects raises AttributeError.