mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[1.7.x] Fixed #23611 -- update_or_create failing from a related manager
Added update_or_create to RelatedManager, ManyRelatedManager and
GenericRelatedObjectManager.
Added missing get_or_create to GenericRelatedObjectManager.
Conflicts:
	tests/generic_relations/tests.py
	tests/get_or_create/tests.py
Backport of ed37f7e979 from master
			
			
This commit is contained in:
		
				
					committed by
					
						 Loic Bistuer
						Loic Bistuer
					
				
			
			
				
	
			
			
			
						parent
						
							dbd52f339c
						
					
				
				
					commit
					fa4b6482df
				
			| @@ -715,13 +715,17 @@ def create_foreign_related_manager(superclass, rel_field, rel_model): | ||||
|         create.alters_data = True | ||||
|  | ||||
|         def get_or_create(self, **kwargs): | ||||
|             # Update kwargs with the related object that this | ||||
|             # ForeignRelatedObjectsDescriptor knows about. | ||||
|             kwargs[rel_field.name] = self.instance | ||||
|             db = router.db_for_write(self.model, instance=self.instance) | ||||
|             return super(RelatedManager, self.db_manager(db)).get_or_create(**kwargs) | ||||
|         get_or_create.alters_data = True | ||||
|  | ||||
|         def update_or_create(self, **kwargs): | ||||
|             kwargs[rel_field.name] = self.instance | ||||
|             db = router.db_for_write(self.model, instance=self.instance) | ||||
|             return super(RelatedManager, self.db_manager(db)).update_or_create(**kwargs) | ||||
|         update_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, **kwargs): | ||||
| @@ -963,8 +967,7 @@ def create_many_related_manager(superclass, rel): | ||||
|  | ||||
|         def get_or_create(self, **kwargs): | ||||
|             db = router.db_for_write(self.instance.__class__, instance=self.instance) | ||||
|             obj, created = \ | ||||
|                 super(ManyRelatedManager, self.db_manager(db)).get_or_create(**kwargs) | ||||
|             obj, created = super(ManyRelatedManager, self.db_manager(db)).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: | ||||
| @@ -972,6 +975,16 @@ def create_many_related_manager(superclass, rel): | ||||
|             return obj, created | ||||
|         get_or_create.alters_data = True | ||||
|  | ||||
|         def update_or_create(self, **kwargs): | ||||
|             db = router.db_for_write(self.instance.__class__, instance=self.instance) | ||||
|             obj, created = super(ManyRelatedManager, self.db_manager(db)).update_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 | ||||
|         update_or_create.alters_data = True | ||||
|  | ||||
|         def _add_items(self, source_field_name, target_field_name, *objs): | ||||
|             # source_field_name: the PK fieldname in join table for the source object | ||||
|             # target_field_name: the PK fieldname in join table for the target object | ||||
|   | ||||
		Reference in New Issue
	
	Block a user