| 
									
										
										
										
											2011-01-17 22:48:38 -05:00
										 |  |  | from django.db.models import OneToOneField | 
					
						
							|  |  |  | from django.db.models.fields.related import SingleRelatedObjectDescriptor | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-17 23:20:25 -05:00
										 |  |  | from south.modelsinspector import add_introspection_rules | 
					
						
							|  |  |  | add_introspection_rules([], ["^utils\.fields\.AutoOneToOneField"]) | 
					
						
							| 
									
										
										
										
											2011-01-17 22:48:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor): | 
					
						
							|  |  |  |     def __get__(self, instance, instance_type=None): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             return super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type) | 
					
						
							|  |  |  |         except self.related.model.DoesNotExist: | 
					
						
							|  |  |  |             obj = self.related.model(**{self.related.field.name: instance}) | 
					
						
							|  |  |  |             obj.save() | 
					
						
							|  |  |  |             return obj | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AutoOneToOneField(OneToOneField): | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     OneToOneField creates related object on first call if it doesnt exist yet. | 
					
						
							|  |  |  |     Use it instead of original OneToOne field. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     example: | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         class MyProfile(models.Model): | 
					
						
							|  |  |  |             user = AutoOneToOneField(User, primary_key=True) | 
					
						
							|  |  |  |             home_page = models.URLField(max_length=255, blank=True) | 
					
						
							|  |  |  |             icq = models.IntegerField(max_length=255, null=True) | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     def contribute_to_related_class(self, cls, related): | 
					
						
							|  |  |  |         setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related)) |