1 | diff -r 1a5661fe179d django/db/models/base.py
|
---|
2 | --- a/django/db/models/base.py Tue Nov 16 15:14:04 2010 +0000
|
---|
3 | +++ b/django/db/models/base.py Tue Nov 16 23:30:27 2010 +0100
|
---|
4 | @@ -126,13 +126,14 @@
|
---|
5 | o2o_map = dict([(f.rel.to, f) for f in new_class._meta.local_fields
|
---|
6 | if isinstance(f, OneToOneField)])
|
---|
7 |
|
---|
8 | - for base in parents:
|
---|
9 | + for creation_level, base in enumerate(parents):
|
---|
10 | original_base = base
|
---|
11 | if not hasattr(base, '_meta'):
|
---|
12 | # Things without _meta aren't functional models, so they're
|
---|
13 | # uninteresting parents.
|
---|
14 | continue
|
---|
15 |
|
---|
16 | + new_class._meta.creation_level = creation_level + 1
|
---|
17 | parent_fields = base._meta.local_fields + base._meta.local_many_to_many
|
---|
18 | # Check for clashes between locally declared fields and those
|
---|
19 | # on the base classes (we cannot handle shadowed fields at the
|
---|
20 | diff -r 1a5661fe179d django/db/models/fields/__init__.py
|
---|
21 | --- a/django/db/models/fields/__init__.py Tue Nov 16 15:14:04 2010 +0000
|
---|
22 | +++ b/django/db/models/fields/__init__.py Tue Nov 16 23:30:27 2010 +0100
|
---|
23 | @@ -57,6 +57,7 @@
|
---|
24 | # The auto_creation_counter is used for fields that Django implicitly
|
---|
25 | # creates, creation_counter is used for all user-specified fields.
|
---|
26 | creation_counter = 0
|
---|
27 | + creation_level = 0
|
---|
28 | auto_creation_counter = -1
|
---|
29 | default_validators = [] # Default set of validators
|
---|
30 | default_error_messages = {
|
---|
31 | @@ -121,7 +122,9 @@
|
---|
32 |
|
---|
33 | def __cmp__(self, other):
|
---|
34 | # This is needed because bisect does not take a comparison function.
|
---|
35 | - return cmp(self.creation_counter, other.creation_counter)
|
---|
36 | + if self.creation_counter <= -1 or other.creation_counter <= -1:
|
---|
37 | + return cmp(self.creation_counter, other.creation_counter)
|
---|
38 | + return cmp((self.creation_level, self.creation_counter), (other.creation_level, other.creation_counter))
|
---|
39 |
|
---|
40 | def __deepcopy__(self, memodict):
|
---|
41 | # We don't have to deepcopy very much here, since most things are not
|
---|
42 | diff -r 1a5661fe179d django/db/models/options.py
|
---|
43 | --- a/django/db/models/options.py Tue Nov 16 15:14:04 2010 +0000
|
---|
44 | +++ b/django/db/models/options.py Tue Nov 16 23:30:27 2010 +0100
|
---|
45 | @@ -27,6 +27,7 @@
|
---|
46 | class Options(object):
|
---|
47 | def __init__(self, meta, app_label=None):
|
---|
48 | self.local_fields, self.local_many_to_many = [], []
|
---|
49 | + self.creation_level = 0
|
---|
50 | self.virtual_fields = []
|
---|
51 | self.module_name, self.verbose_name = None, None
|
---|
52 | self.verbose_name_plural = None
|
---|
53 | @@ -148,6 +149,7 @@
|
---|
54 | # the "creation_counter" attribute of the field.
|
---|
55 | # Move many-to-many related fields from self.fields into
|
---|
56 | # self.many_to_many.
|
---|
57 | + field.creation_level = self.creation_level
|
---|
58 | if field.rel and isinstance(field.rel, ManyToManyRel):
|
---|
59 | self.local_many_to_many.insert(bisect(self.local_many_to_many, field), field)
|
---|
60 | if hasattr(self, '_m2m_cache'):
|
---|