Search code examples
pythondjangomodels

Override ForeignKey relationship in child model?


I am trying to do some model inheritance in django 1.7 and I am wondering if there is a way to over ride foreign key fields? I have a schema for a curriculum and I would like to be able to define multiple curriculums with the same features (pages, questions, levels, etc.)

Here is my code:

http://hastebin.com/ixekepolik.py (Lines 117, 118, 120, 121, 123, 129 and 131)

I'm getting this error currently:

django.core.exceptions.FieldError: Local field 'level' in class 'HVPage' clashes with field of similar name from base class 'Page'

Solution

  • From what I read here, it is disallowed at present (and in django 1.7)

    Field name “hiding” is not permitted¶

    In normal Python class inheritance, it is permissible for a child class to override any attribute from the parent class. In Django, this is not permitted for attributes that are Field instances (at least, not at the moment). If a base class has a field called author, you cannot create another model field called author in any class that inherits from that base class.

    Overriding fields in a parent model leads to difficulties in areas such as initializing new instances (specifying which field is being initialized in Model.init) and serialization. These are features which normal Python class inheritance doesn’t have to deal with in quite the same way, so the difference between Django model inheritance and Python class inheritance isn’t arbitrary.

    This restriction only applies to attributes which are Field instances. Normal Python attributes can be overridden if you wish. It also only applies to the name of the attribute as Python sees it: if you are manually specifying the database column name, you can have the same column name appearing in both a child and an ancestor model for multi-table inheritance (they are columns in two different database tables).

    Django will raise a FieldError if you override any model field in any ancestor model.