""" 1. Bare-bones model This is a basic model with only two non-primary-key fields. """ from django.core import meta class Article(meta.Model): headline = meta.CharField(maxlength=100, default='Default headline') pub_date = meta.DateTimeField() API_TESTS = """ # No articles are in the system yet. >>> articles.get_list() [] # Create an Article. >>> from datetime import datetime >>> a = articles.Article(id=None, headline='Area man programs in Python', ... pub_date=datetime(2005, 7, 28)) # Save it into the database. You have to call save() explicitly. >>> a.save() # Now it has an ID. Note it's a long integer, as designated by the trailing "L". >>> a.id 1L # Access database columns via Python attributes. >>> a.headline 'Area man programs in Python' >>> a.pub_date datetime.datetime(2005, 7, 28, 0, 0) # Change values by changing the attributes, then calling save(). >>> a.headline = 'Area woman programs in Python' >>> a.save() # get_list() displays all the articles in the database. Note that the article # is represented by "
", because we haven't given the Article # model a __repr__() method. >>> articles.get_list() [
] # Django provides a rich database lookup API that's entirely driven by # keyword arguments. >>> articles.get_object(id__exact=1)
>>> articles.get_object(headline__startswith='Area woman')
>>> articles.get_object(pub_date__year=2005)
# Django raises an ArticleDoesNotExist exception for get_object() >>> articles.get_object(id__exact=2) Traceback (most recent call last): ... ArticleDoesNotExist: Article does not exist for {'id__exact': 2} # Lookup by a primary key is the most common case, so Django provides a # shortcut for primary-key exact lookups. # The following is identical to articles.get_object(id__exact=1). >>> articles.get_object(pk=1)
# Model instances of the same type and same ID are considered equal. >>> a = articles.get_object(pk=1) >>> b = articles.get_object(pk=1) >>> a == b True # You can initialize a model instance using positional arguments, which should # match the field order as defined in the model... >>> a2 = articles.Article(None, 'Second article', datetime(2005, 7, 29)) >>> a2.save() >>> a2.id 2L >>> a2.headline 'Second article' >>> a2.pub_date datetime.datetime(2005, 7, 29, 0, 0) # ...or, you can use keyword arguments. >>> a3 = articles.Article(id=None, headline='Third article', ... pub_date=datetime(2005, 7, 30)) >>> a3.save() >>> a3.id 3L >>> a3.headline 'Third article' >>> a3.pub_date datetime.datetime(2005, 7, 30, 0, 0) # You can also mix and match position and keyword arguments, but be sure not to # duplicate field information. >>> a4 = articles.Article(None, 'Fourth article', pub_date=datetime(2005, 7, 31)) >>> a4.save() >>> a4.headline 'Fourth article' # Don't use invalid keyword arguments. >>> a5 = articles.Article(id=None, headline='Invalid', pub_date=datetime(2005, 7, 31), foo='bar') Traceback (most recent call last): ... TypeError: 'foo' is an invalid keyword argument for this function # You can leave off the ID. >>> a5 = articles.Article(headline='Article 6', pub_date=datetime(2005, 7, 31)) >>> a5.save() >>> a5.id 5L >>> a5.headline 'Article 6' # If you leave off a field with "default" set, Django will use the default. >>> a6 = articles.Article(pub_date=datetime(2005, 7, 31)) >>> a6.save() >>> a6.headline 'Default headline' # For DateTimeFields, Django saves as much precision (in seconds) as you # give it. >>> a7 = articles.Article(headline='Article 7', pub_date=datetime(2005, 7, 31, 12, 30)) >>> a7.save() >>> articles.get_object(id__exact=7).pub_date datetime.datetime(2005, 7, 31, 12, 30) >>> a8 = articles.Article(headline='Article 8', pub_date=datetime(2005, 7, 31, 12, 30, 45)) >>> a8.save() >>> articles.get_object(id__exact=8).pub_date datetime.datetime(2005, 7, 31, 12, 30, 45) >>> a8.id 8L # Saving an object again shouldn't create a new object -- it just saves the old one. >>> a8.save() >>> a8.id 8L >>> a8.headline = 'Updated article 8' >>> a8.save() >>> a8.id 8L """ from django.conf import settings building_docs = getattr(settings, 'BUILDING_DOCS', False) if building_docs or settings.DATABASE_ENGINE == 'postgresql': API_TESTS += """ # In PostgreSQL, microsecond-level precision is available. >>> a9 = articles.Article(headline='Article 9', pub_date=datetime(2005, 7, 31, 12, 30, 45, 180)) >>> a9.save() >>> articles.get_object(id__exact=9).pub_date datetime.datetime(2005, 7, 31, 12, 30, 45, 180) """ if building_docs or settings.DATABASE_ENGINE == 'mysql': API_TESTS += """ # In MySQL, microsecond-level precision isn't available. You'll lose # microsecond-level precision once the data is saved. >>> a9 = articles.Article(headline='Article 9', pub_date=datetime(2005, 7, 31, 12, 30, 45, 180)) >>> a9.save() >>> articles.get_object(id__exact=9).pub_date datetime.datetime(2005, 7, 31, 12, 30, 45) """