2014-02-05 1 views
1

У меня есть модель, я использую в качестве опорной точки для создания другой модели:Частичная модель наследования в Django

class ImYourFather(models.Model): 
    force = fields.HTMLField(null=True, blank=True) 
    supermarket_planets = models.HTMLField(null=True, blank=True) 
    destroying_planets = models.HTMLField() 

class Luke(ImYourFather): 
    # Inheriting all the fields from father 
    the_cool_kid = models.HTMLField() # extra field added 

Я НЕ хочу, чтобы наследовать destroying_planets поля, возможно ли это?
Я спрашиваю конкретно, потому что destroying_planets должен быть обязательно в модели отца, но хотел бы иметь его факультативно в детской модели.
Является ли это достижимым по-другому?

+0

Если вы наследуете от класса, вы * наследуете все поля. Также проверьте это: https://docs.djangoproject.com/ru/dev/topics/db/models/#field-name-hiding-is-not-permitted – Serafeim

+0

Спасибо, Есть все равно, чтобы сообщить Django, что обязательный поле в отце должно быть необязательным у ребенка (без изменения отца)? – Leonardo

ответ

2

Вы не можете частично наследовать, но вы можете вручную создать модели с любыми полями, которые вам нужны. Это не совсем так же, как multi-table inheritance, но это единственный способ частично наследует поля:

class Base(models.Model): 
    force = fields.HTMLField(null=True, blank=True) 
    supermarket_planets = models.HTMLField(null=True, blank=True) 

    class Meta(object): 
     abstract = True 

class ImYourFather(Base): 
    destroying_planets = models.HTMLField() 

class Luke(Base): 
    # optional in case you need this 
    father = models.OneToOneField(ImYourFather, related_name='lukes') 
    the_cool_kid = models.HTMLField() # extra field added 

редактировать

Другой подход заключается просто скопировать поля от отца. Это все непроверено, поэтому Django может лаять вас на некоторые из них). Преимущество состоит в том, что никакая обезьяна-патч, но должна работать:

exclude = ['id', 'destroying_planets'] 
try: # Django 1.7 
    fields = {i.attname: i.clone() for i in ImYourFather._meta.fields if not i.attname in exclude} 
except AttributeError: # Django < 1.7 
    fields = {i.attname: deepcopy(i) for i in ImYourFather._meta.fields if not i.attname in exclude} 
Base = type('Base', (models.Model,), fields) 

class Luke(Base): 
    # optional in case you need this 
    father = models.OneToOneField(ImYourFather, related_name='lukes') 
    the_cool_kid = models.HTMLField() # extra field added 
+0

Спасибо, но у меня нет возможности изменить класс отца. Есть ли в любом случае, чтобы сообщить Django, что обязательное поле в отце должно быть необязательным для ребенка? – Leonardo

+0

Я так не думаю. – miki725

+0

Извините, перепутав с комментарием. Хорошо, получилось, спасибо – Leonardo