Fixed #8825 -- Fixed a small error model field setup (on the model class) from
r8855. Patch from Christofer Bernander. Test based on one from cgrady. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8908 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
43f901e581
commit
780f239fa7
|
@ -87,13 +87,13 @@ class ModelBase(type):
|
||||||
# Things without _meta aren't functional models, so they're
|
# Things without _meta aren't functional models, so they're
|
||||||
# uninteresting parents.
|
# uninteresting parents.
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# All the fields of any type declared on this model
|
# All the fields of any type declared on this model
|
||||||
new_fields = new_class._meta.local_fields + \
|
new_fields = new_class._meta.local_fields + \
|
||||||
new_class._meta.many_to_many + \
|
new_class._meta.local_many_to_many + \
|
||||||
new_class._meta.virtual_fields
|
new_class._meta.virtual_fields
|
||||||
field_names = set([f.name for f in new_fields])
|
field_names = set([f.name for f in new_fields])
|
||||||
|
|
||||||
# Concrete classes...
|
# Concrete classes...
|
||||||
if not base._meta.abstract:
|
if not base._meta.abstract:
|
||||||
if base in o2o_map:
|
if base in o2o_map:
|
||||||
|
@ -106,7 +106,7 @@ class ModelBase(type):
|
||||||
auto_created=True, parent_link=True)
|
auto_created=True, parent_link=True)
|
||||||
new_class.add_to_class(attr_name, field)
|
new_class.add_to_class(attr_name, field)
|
||||||
new_class._meta.parents[base] = field
|
new_class._meta.parents[base] = field
|
||||||
|
|
||||||
# .. and abstract ones.
|
# .. and abstract ones.
|
||||||
else:
|
else:
|
||||||
# Check for clashes between locally declared fields and those on the ABC.
|
# Check for clashes between locally declared fields and those on the ABC.
|
||||||
|
@ -127,7 +127,7 @@ class ModelBase(type):
|
||||||
if not val or val is manager:
|
if not val or val is manager:
|
||||||
new_manager = manager._copy_to_model(new_class)
|
new_manager = manager._copy_to_model(new_class)
|
||||||
new_class.add_to_class(mgr_name, new_manager)
|
new_class.add_to_class(mgr_name, new_manager)
|
||||||
|
|
||||||
# Inherit virtual fields (like GenericForeignKey) from the parent class
|
# Inherit virtual fields (like GenericForeignKey) from the parent class
|
||||||
for field in base._meta.virtual_fields:
|
for field in base._meta.virtual_fields:
|
||||||
if base._meta.abstract and field.name in field_names:
|
if base._meta.abstract and field.name in field_names:
|
||||||
|
@ -136,7 +136,7 @@ class ModelBase(type):
|
||||||
'abstract base class %r' % \
|
'abstract base class %r' % \
|
||||||
(field.name, name, base.__name__))
|
(field.name, name, base.__name__))
|
||||||
new_class.add_to_class(field.name, copy.deepcopy(field))
|
new_class.add_to_class(field.name, copy.deepcopy(field))
|
||||||
|
|
||||||
if abstract:
|
if abstract:
|
||||||
# Abstract base models can't be instantiated and don't appear in
|
# Abstract base models can't be instantiated and don't appear in
|
||||||
# the list of models for an app. We do the final setup for them a
|
# the list of models for an app. We do the final setup for them a
|
||||||
|
|
|
@ -69,7 +69,13 @@ class Article(models.Model):
|
||||||
return self.headline
|
return self.headline
|
||||||
|
|
||||||
class ArticleWithAuthor(Article):
|
class ArticleWithAuthor(Article):
|
||||||
author = models.CharField(max_length=100)
|
author = models.CharField(max_length=100)
|
||||||
|
|
||||||
|
class M2MBase(models.Model):
|
||||||
|
articles = models.ManyToManyField(Article)
|
||||||
|
|
||||||
|
class M2MChild(M2MBase):
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
|
|
||||||
__test__ = {'API_TESTS':"""
|
__test__ = {'API_TESTS':"""
|
||||||
# Regression for #7350, #7202
|
# Regression for #7350, #7202
|
||||||
|
@ -231,4 +237,9 @@ Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
DoesNotExist: ArticleWithAuthor matching query does not exist.
|
DoesNotExist: ArticleWithAuthor matching query does not exist.
|
||||||
|
|
||||||
|
# Regression test for #8825: Make sure all inherited fields (esp. m2m fields, in
|
||||||
|
# this case) appear on the child class.
|
||||||
|
>>> M2MChild.objects.filter(articles__isnull=False)
|
||||||
|
[]
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
Loading…
Reference in New Issue