""" 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)
>>> articles.get_object(pub_date__year=2005, pub_date__month=7)
>>> articles.get_object(pub_date__year=2005, pub_date__month=7, pub_date__day=28)
>>> articles.get_list(pub_date__year=2005) [
] >>> articles.get_list(pub_date__year=2004) [] >>> articles.get_list(pub_date__year=2005, pub_date__month=7) [
] # 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 {'order_by': (), 'id__exact': 2} >>> articles.get_object(pub_date__year=2005, pub_date__month=8) Traceback (most recent call last): ... ArticleDoesNotExist: Article does not exist for ... # 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 >>> a7 == a8 False >>> a8 == articles.get_object(id__exact=8) True >>> a7 != a8 True >>> articles.get_object(id__exact=8) != articles.get_object(id__exact=7) True >>> articles.get_object(id__exact=8) == articles.get_object(id__exact=7) False """ 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) """ API_TESTS += """ # You can manually specify the primary key when creating a new object >>> a101 = articles.Article(id=101, headline='Article 101', pub_date=datetime(2005, 7, 31, 12, 30, 45)) >>> a101.save() >>> a101 = articles.get_object(pk=101) >>> a101.headline 'Article 101' """