thirdparty/google_appengine/lib/django/tests/modeltests/custom_columns/models.py
changeset 2866 a04b1e4126c4
parent 2864 2e0b0af889be
child 2868 9f7f269383f7
equal deleted inserted replaced
2864:2e0b0af889be 2866:a04b1e4126c4
     1 """
       
     2 17. Custom column/table names
       
     3 
       
     4 If your database column name is different than your model attribute, use the
       
     5 ``db_column`` parameter. Note that you'll use the field's name, not its column
       
     6 name, in API usage.
       
     7 
       
     8 If your database table name is different than your model name, use the
       
     9 ``db_table`` Meta attribute. This has no effect on the API used to 
       
    10 query the database.
       
    11 
       
    12 If you need to use a table name for a many-to-many relationship that differs 
       
    13 from the default generated name, use the ``db_table`` parameter on the 
       
    14 ManyToMany field. This has no effect on the API for querying the database.
       
    15 
       
    16 """
       
    17 
       
    18 from django.db import models
       
    19 
       
    20 class Author(models.Model):
       
    21     first_name = models.CharField(maxlength=30, db_column='firstname')
       
    22     last_name = models.CharField(maxlength=30, db_column='last')
       
    23 
       
    24     def __str__(self):
       
    25         return '%s %s' % (self.first_name, self.last_name)
       
    26 
       
    27     class Meta:
       
    28         db_table = 'my_author_table'
       
    29         ordering = ('last_name','first_name')
       
    30 
       
    31 class Article(models.Model):
       
    32     headline = models.CharField(maxlength=100)
       
    33     authors = models.ManyToManyField(Author, db_table='my_m2m_table')
       
    34 
       
    35     def __str__(self):
       
    36         return self.headline
       
    37 
       
    38     class Meta:
       
    39         ordering = ('headline',)
       
    40         
       
    41 __test__ = {'API_TESTS':"""
       
    42 # Create a Author.
       
    43 >>> a = Author(first_name='John', last_name='Smith')
       
    44 >>> a.save()
       
    45 
       
    46 >>> a.id
       
    47 1
       
    48 
       
    49 # Create another author
       
    50 >>> a2 = Author(first_name='Peter', last_name='Jones')
       
    51 >>> a2.save()
       
    52 
       
    53 # Create an article
       
    54 >>> art = Article(headline='Django lets you build web apps easily')
       
    55 >>> art.save()
       
    56 >>> art.authors = [a, a2]
       
    57 
       
    58 # Although the table and column names on Author have been set to 
       
    59 # custom values, nothing about using the Author model has changed...
       
    60 
       
    61 # Query the available authors
       
    62 >>> Author.objects.all()
       
    63 [<Author: Peter Jones>, <Author: John Smith>]
       
    64 
       
    65 >>> Author.objects.filter(first_name__exact='John')
       
    66 [<Author: John Smith>]
       
    67 
       
    68 >>> Author.objects.get(first_name__exact='John')
       
    69 <Author: John Smith>
       
    70 
       
    71 >>> Author.objects.filter(firstname__exact='John')
       
    72 Traceback (most recent call last):
       
    73     ...
       
    74 TypeError: Cannot resolve keyword 'firstname' into field
       
    75 
       
    76 >>> a = Author.objects.get(last_name__exact='Smith')
       
    77 >>> a.first_name
       
    78 'John'
       
    79 >>> a.last_name
       
    80 'Smith'
       
    81 >>> a.firstname
       
    82 Traceback (most recent call last):
       
    83     ...
       
    84 AttributeError: 'Author' object has no attribute 'firstname'
       
    85 >>> a.last
       
    86 Traceback (most recent call last):
       
    87     ...
       
    88 AttributeError: 'Author' object has no attribute 'last'
       
    89 
       
    90 # Although the Article table uses a custom m2m table, 
       
    91 # nothing about using the m2m relationship has changed...
       
    92 
       
    93 # Get all the authors for an article
       
    94 >>> art.authors.all()
       
    95 [<Author: Peter Jones>, <Author: John Smith>]
       
    96 
       
    97 # Get the articles for an author
       
    98 >>> a.article_set.all()
       
    99 [<Article: Django lets you build web apps easily>]
       
   100 
       
   101 # Query the authors across the m2m relation
       
   102 >>> art.authors.filter(last_name='Jones')
       
   103 [<Author: Peter Jones>]
       
   104 
       
   105 """}