mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	git-svn-id: http://code.djangoproject.com/svn/django/trunk@696 bcc190cf-cafb-0310-a4f2-bffc1f526a37
		
			
				
	
	
		
			181 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| 15. Subclassing models
 | |
| 
 | |
| You can subclass another model to create a copy of it that behaves slightly
 | |
| differently.
 | |
| """
 | |
| 
 | |
| from django.core import meta
 | |
| 
 | |
| # From the "Bare-bones model" example
 | |
| from django.models.basic import Article
 | |
| 
 | |
| # From the "Adding __repr__()" example
 | |
| from django.models.repr import Article as ArticleWithRepr
 | |
| 
 | |
| # From the "Specifying ordering" example
 | |
| from django.models.ordering import Article as ArticleWithOrdering
 | |
| 
 | |
| # This uses all fields and metadata from Article and
 | |
| # adds a "section" field.
 | |
| class ArticleWithSection(Article):
 | |
|     section = meta.CharField(maxlength=30)
 | |
|     class META:
 | |
|        module_name = 'subarticles1'
 | |
| 
 | |
| # This uses all fields and metadata from Article but
 | |
| # removes the "pub_date" field.
 | |
| class ArticleWithoutPubDate(Article):
 | |
|     class META:
 | |
|        module_name = 'subarticles2'
 | |
|        remove_fields = ('pub_date',)
 | |
| 
 | |
| # This uses all fields and metadata from Article but
 | |
| # overrides the "pub_date" field.
 | |
| class ArticleWithFieldOverride(Article):
 | |
|     pub_date = meta.DateField() # overrides the old field, a DateTimeField
 | |
|     class META:
 | |
|         module_name = 'subarticles3'
 | |
|         # No need to add remove_fields = ('pub_date',)
 | |
| 
 | |
| # This uses all fields and metadata from ArticleWithRepr and
 | |
| # makes a few additions/changes.
 | |
| class ArticleWithManyChanges(ArticleWithRepr):
 | |
|     section = meta.CharField(maxlength=30)
 | |
|     is_popular = meta.BooleanField()
 | |
|     pub_date = meta.DateField() # overrides the old field, a DateTimeField
 | |
|     class META:
 | |
|        module_name = 'subarticles4'
 | |
| 
 | |
| # This uses all fields from ArticleWithOrdering but
 | |
| # changes the ordering parameter.
 | |
| class ArticleWithChangedMeta(ArticleWithOrdering):
 | |
|     class META:
 | |
|        module_name = 'subarticles5'
 | |
|        ordering = ('headline', 'pub_date')
 | |
| 
 | |
| # These two models don't define a module_name.
 | |
| class NoModuleNameFirst(Article):
 | |
|     section = meta.CharField(maxlength=30)
 | |
| 
 | |
| class NoModuleNameSecond(Article):
 | |
|     section = meta.CharField(maxlength=30)
 | |
| 
 | |
| API_TESTS = """
 | |
| # No data is in the system yet.
 | |
| >>> subarticles1.get_list()
 | |
| []
 | |
| >>> subarticles2.get_list()
 | |
| []
 | |
| >>> subarticles3.get_list()
 | |
| []
 | |
| 
 | |
| # Create an ArticleWithSection.
 | |
| >>> from datetime import date, datetime
 | |
| >>> a1 = subarticles1.ArticleWithSection(headline='First', pub_date=datetime(2005, 8, 22), section='News')
 | |
| >>> a1.save()
 | |
| >>> a1
 | |
| <ArticleWithSection object>
 | |
| >>> a1.id
 | |
| 1
 | |
| >>> a1.headline
 | |
| 'First'
 | |
| >>> a1.pub_date
 | |
| datetime.datetime(2005, 8, 22, 0, 0)
 | |
| 
 | |
| # Retrieve it again, to prove the fields have been saved.
 | |
| >>> a1 = subarticles1.get_object(pk=1)
 | |
| >>> a1.headline
 | |
| 'First'
 | |
| >>> a1.pub_date
 | |
| datetime.datetime(2005, 8, 22, 0, 0)
 | |
| >>> a1.section
 | |
| 'News'
 | |
| 
 | |
| # Create an ArticleWithoutPubDate.
 | |
| >>> a2 = subarticles2.ArticleWithoutPubDate(headline='Second')
 | |
| >>> a2.save()
 | |
| >>> a2
 | |
| <ArticleWithoutPubDate object>
 | |
| >>> a2.id
 | |
| 1
 | |
| >>> a2.pub_date
 | |
| Traceback (most recent call last):
 | |
|     ...
 | |
| AttributeError: 'ArticleWithoutPubDate' object has no attribute 'pub_date'
 | |
| 
 | |
| # Retrieve it again, to prove the fields have been saved.
 | |
| >>> a2 = subarticles2.get_object(pk=1)
 | |
| >>> a2.headline
 | |
| 'Second'
 | |
| >>> a2.pub_date
 | |
| Traceback (most recent call last):
 | |
|     ...
 | |
| AttributeError: 'ArticleWithoutPubDate' object has no attribute 'pub_date'
 | |
| 
 | |
| # Create an ArticleWithFieldOverride.
 | |
| >>> a3 = subarticles3.ArticleWithFieldOverride(headline='Third', pub_date=date(2005, 8, 22))
 | |
| >>> a3.save()
 | |
| >>> a3
 | |
| <ArticleWithFieldOverride object>
 | |
| >>> a3.id
 | |
| 1
 | |
| >>> a3.pub_date
 | |
| datetime.date(2005, 8, 22)
 | |
| 
 | |
| # Retrieve it again, to prove the fields have been saved.
 | |
| >>> a3 = subarticles3.get_object(pk=1)
 | |
| >>> a3.headline
 | |
| 'Third'
 | |
| >>> a3.pub_date
 | |
| datetime.date(2005, 8, 22)
 | |
| 
 | |
| # Create an ArticleWithManyChanges.
 | |
| >>> a4 = subarticles4.ArticleWithManyChanges(headline='Fourth', section='Arts',
 | |
| ...     is_popular=True, pub_date=date(2005, 8, 22))
 | |
| >>> a4.save()
 | |
| 
 | |
| # a4 inherits __repr__() from its parent model (ArticleWithRepr).
 | |
| >>> a4
 | |
| Fourth
 | |
| 
 | |
| # Retrieve it again, to prove the fields have been saved.
 | |
| >>> a4 = subarticles4.get_object(pk=1)
 | |
| >>> a4.headline
 | |
| 'Fourth'
 | |
| >>> a4.section
 | |
| 'Arts'
 | |
| >>> a4.is_popular == True
 | |
| True
 | |
| >>> a4.pub_date
 | |
| datetime.date(2005, 8, 22)
 | |
| 
 | |
| # Test get_list().
 | |
| >>> subarticles1.get_list()
 | |
| [<ArticleWithSection object>]
 | |
| >>> subarticles2.get_list()
 | |
| [<ArticleWithoutPubDate object>]
 | |
| >>> subarticles3.get_list()
 | |
| [<ArticleWithFieldOverride object>]
 | |
| >>> subarticles4.get_list()
 | |
| [Fourth]
 | |
| 
 | |
| # Create a couple of ArticleWithChangedMeta objects.
 | |
| >>> a5 = subarticles5.ArticleWithChangedMeta(headline='A', pub_date=datetime(2005, 3, 1))
 | |
| >>> a5.save()
 | |
| >>> a6 = subarticles5.ArticleWithChangedMeta(headline='B', pub_date=datetime(2005, 4, 1))
 | |
| >>> a6.save()
 | |
| >>> a7 = subarticles5.ArticleWithChangedMeta(headline='C', pub_date=datetime(2005, 5, 1))
 | |
| >>> a7.save()
 | |
| 
 | |
| # Ordering has been overridden, so objects are ordered
 | |
| # by headline ASC instead of pub_date DESC.
 | |
| >>> subarticles5.get_list()
 | |
| [A, B, C]
 | |
| 
 | |
| >>> nomodulenamefirsts.get_list()
 | |
| []
 | |
| >>> nomodulenameseconds.get_list()
 | |
| []
 | |
| """
 |