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 """} |
|