1 """ |
|
2 26. Invalid models |
|
3 |
|
4 This example exists purely to point out errors in models. |
|
5 """ |
|
6 |
|
7 from django.db import models |
|
8 |
|
9 class FieldErrors(models.Model): |
|
10 charfield = models.CharField() |
|
11 floatfield = models.FloatField() |
|
12 filefield = models.FileField() |
|
13 prepopulate = models.CharField(maxlength=10, prepopulate_from='bad') |
|
14 choices = models.CharField(maxlength=10, choices='bad') |
|
15 choices2 = models.CharField(maxlength=10, choices=[(1,2,3),(1,2,3)]) |
|
16 index = models.CharField(maxlength=10, db_index='bad') |
|
17 |
|
18 class Target(models.Model): |
|
19 tgt_safe = models.CharField(maxlength=10) |
|
20 clash1 = models.CharField(maxlength=10) |
|
21 clash2 = models.CharField(maxlength=10) |
|
22 |
|
23 clash1_set = models.CharField(maxlength=10) |
|
24 |
|
25 class Clash1(models.Model): |
|
26 src_safe = models.CharField(maxlength=10, core=True) |
|
27 |
|
28 foreign = models.ForeignKey(Target) |
|
29 m2m = models.ManyToManyField(Target) |
|
30 |
|
31 class Clash2(models.Model): |
|
32 src_safe = models.CharField(maxlength=10, core=True) |
|
33 |
|
34 foreign_1 = models.ForeignKey(Target, related_name='id') |
|
35 foreign_2 = models.ForeignKey(Target, related_name='src_safe') |
|
36 |
|
37 m2m_1 = models.ManyToManyField(Target, related_name='id') |
|
38 m2m_2 = models.ManyToManyField(Target, related_name='src_safe') |
|
39 |
|
40 class Target2(models.Model): |
|
41 clash3 = models.CharField(maxlength=10) |
|
42 foreign_tgt = models.ForeignKey(Target) |
|
43 clashforeign_set = models.ForeignKey(Target) |
|
44 |
|
45 m2m_tgt = models.ManyToManyField(Target) |
|
46 clashm2m_set = models.ManyToManyField(Target) |
|
47 |
|
48 class Clash3(models.Model): |
|
49 src_safe = models.CharField(maxlength=10, core=True) |
|
50 |
|
51 foreign_1 = models.ForeignKey(Target2, related_name='foreign_tgt') |
|
52 foreign_2 = models.ForeignKey(Target2, related_name='m2m_tgt') |
|
53 |
|
54 m2m_1 = models.ManyToManyField(Target2, related_name='foreign_tgt') |
|
55 m2m_2 = models.ManyToManyField(Target2, related_name='m2m_tgt') |
|
56 |
|
57 class ClashForeign(models.Model): |
|
58 foreign = models.ForeignKey(Target2) |
|
59 |
|
60 class ClashM2M(models.Model): |
|
61 m2m = models.ManyToManyField(Target2) |
|
62 |
|
63 class SelfClashForeign(models.Model): |
|
64 src_safe = models.CharField(maxlength=10, core=True) |
|
65 selfclashforeign = models.CharField(maxlength=10) |
|
66 |
|
67 selfclashforeign_set = models.ForeignKey("SelfClashForeign") |
|
68 foreign_1 = models.ForeignKey("SelfClashForeign", related_name='id') |
|
69 foreign_2 = models.ForeignKey("SelfClashForeign", related_name='src_safe') |
|
70 |
|
71 class ValidM2M(models.Model): |
|
72 src_safe = models.CharField(maxlength=10) |
|
73 validm2m = models.CharField(maxlength=10) |
|
74 |
|
75 # M2M fields are symmetrical by default. Symmetrical M2M fields |
|
76 # on self don't require a related accessor, so many potential |
|
77 # clashes are avoided. |
|
78 validm2m_set = models.ManyToManyField("ValidM2M") |
|
79 |
|
80 m2m_1 = models.ManyToManyField("ValidM2M", related_name='id') |
|
81 m2m_2 = models.ManyToManyField("ValidM2M", related_name='src_safe') |
|
82 |
|
83 m2m_3 = models.ManyToManyField('self') |
|
84 m2m_4 = models.ManyToManyField('self') |
|
85 |
|
86 class SelfClashM2M(models.Model): |
|
87 src_safe = models.CharField(maxlength=10) |
|
88 selfclashm2m = models.CharField(maxlength=10) |
|
89 |
|
90 # Non-symmetrical M2M fields _do_ have related accessors, so |
|
91 # there is potential for clashes. |
|
92 selfclashm2m_set = models.ManyToManyField("SelfClashM2M", symmetrical=False) |
|
93 |
|
94 m2m_1 = models.ManyToManyField("SelfClashM2M", related_name='id', symmetrical=False) |
|
95 m2m_2 = models.ManyToManyField("SelfClashM2M", related_name='src_safe', symmetrical=False) |
|
96 |
|
97 m2m_3 = models.ManyToManyField('self', symmetrical=False) |
|
98 m2m_4 = models.ManyToManyField('self', symmetrical=False) |
|
99 |
|
100 model_errors = """invalid_models.fielderrors: "charfield": CharFields require a "maxlength" attribute. |
|
101 invalid_models.fielderrors: "floatfield": FloatFields require a "decimal_places" attribute. |
|
102 invalid_models.fielderrors: "floatfield": FloatFields require a "max_digits" attribute. |
|
103 invalid_models.fielderrors: "filefield": FileFields require an "upload_to" attribute. |
|
104 invalid_models.fielderrors: "prepopulate": prepopulate_from should be a list or tuple. |
|
105 invalid_models.fielderrors: "choices": "choices" should be iterable (e.g., a tuple or list). |
|
106 invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples. |
|
107 invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples. |
|
108 invalid_models.fielderrors: "index": "db_index" should be either None, True or False. |
|
109 invalid_models.clash1: Accessor for field 'foreign' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'. |
|
110 invalid_models.clash1: Accessor for field 'foreign' clashes with related m2m field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'. |
|
111 invalid_models.clash1: Reverse query name for field 'foreign' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'foreign'. |
|
112 invalid_models.clash1: Accessor for m2m field 'm2m' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'm2m'. |
|
113 invalid_models.clash1: Accessor for m2m field 'm2m' clashes with related field 'Target.clash1_set'. Add a related_name argument to the definition for 'm2m'. |
|
114 invalid_models.clash1: Reverse query name for m2m field 'm2m' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'm2m'. |
|
115 invalid_models.clash2: Accessor for field 'foreign_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'. |
|
116 invalid_models.clash2: Accessor for field 'foreign_1' clashes with related m2m field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'. |
|
117 invalid_models.clash2: Reverse query name for field 'foreign_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'. |
|
118 invalid_models.clash2: Reverse query name for field 'foreign_1' clashes with related m2m field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'. |
|
119 invalid_models.clash2: Accessor for field 'foreign_2' clashes with related m2m field 'Target.src_safe'. Add a related_name argument to the definition for 'foreign_2'. |
|
120 invalid_models.clash2: Reverse query name for field 'foreign_2' clashes with related m2m field 'Target.src_safe'. Add a related_name argument to the definition for 'foreign_2'. |
|
121 invalid_models.clash2: Accessor for m2m field 'm2m_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'. |
|
122 invalid_models.clash2: Accessor for m2m field 'm2m_1' clashes with related field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'. |
|
123 invalid_models.clash2: Reverse query name for m2m field 'm2m_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'. |
|
124 invalid_models.clash2: Reverse query name for m2m field 'm2m_1' clashes with related field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'. |
|
125 invalid_models.clash2: Accessor for m2m field 'm2m_2' clashes with related field 'Target.src_safe'. Add a related_name argument to the definition for 'm2m_2'. |
|
126 invalid_models.clash2: Reverse query name for m2m field 'm2m_2' clashes with related field 'Target.src_safe'. Add a related_name argument to the definition for 'm2m_2'. |
|
127 invalid_models.clash3: Accessor for field 'foreign_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'. |
|
128 invalid_models.clash3: Accessor for field 'foreign_1' clashes with related m2m field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'. |
|
129 invalid_models.clash3: Reverse query name for field 'foreign_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'. |
|
130 invalid_models.clash3: Reverse query name for field 'foreign_1' clashes with related m2m field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'. |
|
131 invalid_models.clash3: Accessor for field 'foreign_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'. |
|
132 invalid_models.clash3: Accessor for field 'foreign_2' clashes with related m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'. |
|
133 invalid_models.clash3: Reverse query name for field 'foreign_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'. |
|
134 invalid_models.clash3: Reverse query name for field 'foreign_2' clashes with related m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'. |
|
135 invalid_models.clash3: Accessor for m2m field 'm2m_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'. |
|
136 invalid_models.clash3: Accessor for m2m field 'm2m_1' clashes with related field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'. |
|
137 invalid_models.clash3: Reverse query name for m2m field 'm2m_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'. |
|
138 invalid_models.clash3: Reverse query name for m2m field 'm2m_1' clashes with related field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'. |
|
139 invalid_models.clash3: Accessor for m2m field 'm2m_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'. |
|
140 invalid_models.clash3: Accessor for m2m field 'm2m_2' clashes with related field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'. |
|
141 invalid_models.clash3: Reverse query name for m2m field 'm2m_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'. |
|
142 invalid_models.clash3: Reverse query name for m2m field 'm2m_2' clashes with related field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'. |
|
143 invalid_models.clashforeign: Accessor for field 'foreign' clashes with field 'Target2.clashforeign_set'. Add a related_name argument to the definition for 'foreign'. |
|
144 invalid_models.clashm2m: Accessor for m2m field 'm2m' clashes with m2m field 'Target2.clashm2m_set'. Add a related_name argument to the definition for 'm2m'. |
|
145 invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'. |
|
146 invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'. |
|
147 invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'. |
|
148 invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'. |
|
149 invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'. |
|
150 invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'. |
|
151 invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'. |
|
152 invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'. |
|
153 invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'. |
|
154 invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'. |
|
155 invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'. |
|
156 invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'. |
|
157 invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'. |
|
158 invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'. |
|
159 invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'. |
|
160 invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'. |
|
161 invalid_models.selfclashforeign: Accessor for field 'selfclashforeign_set' clashes with field 'SelfClashForeign.selfclashforeign_set'. Add a related_name argument to the definition for 'selfclashforeign_set'. |
|
162 invalid_models.selfclashforeign: Reverse query name for field 'selfclashforeign_set' clashes with field 'SelfClashForeign.selfclashforeign'. Add a related_name argument to the definition for 'selfclashforeign_set'. |
|
163 invalid_models.selfclashforeign: Accessor for field 'foreign_1' clashes with field 'SelfClashForeign.id'. Add a related_name argument to the definition for 'foreign_1'. |
|
164 invalid_models.selfclashforeign: Reverse query name for field 'foreign_1' clashes with field 'SelfClashForeign.id'. Add a related_name argument to the definition for 'foreign_1'. |
|
165 invalid_models.selfclashforeign: Accessor for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'. |
|
166 invalid_models.selfclashforeign: Reverse query name for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'. |
|
167 invalid_models.selfclashm2m: Accessor for m2m field 'selfclashm2m_set' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'selfclashm2m_set'. |
|
168 invalid_models.selfclashm2m: Reverse query name for m2m field 'selfclashm2m_set' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'selfclashm2m_set'. |
|
169 invalid_models.selfclashm2m: Accessor for m2m field 'selfclashm2m_set' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'selfclashm2m_set'. |
|
170 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'. |
|
171 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'. |
|
172 invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'. |
|
173 invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'. |
|
174 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_3' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_3'. |
|
175 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_3' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_3'. |
|
176 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_3' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_3'. |
|
177 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_4' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_4'. |
|
178 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_4' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_4'. |
|
179 invalid_models.selfclashm2m: Accessor for m2m field 'm2m_4' clashes with related m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'm2m_4'. |
|
180 invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_3' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'm2m_3'. |
|
181 invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_4' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'm2m_4'. |
|
182 """ |
|