2013-08-22 3 views
1

У меня есть что-то вроде этого:Джанго: понижающее приведение автоматически в многотабличного наследования/полиморфные таблиц

class Base(Model): 
    ... 
    def downcast(self): 
     try: 
      return self.childa 
     except: 
      pass 
     try: 
      return self.childb 
     except: 
      pass 
     return self 


class ChildA(Base): 
    .... 

class ChildB(Base): 
    .... 

class Foo(Model): 
    child = ForeignKey(Base) 

Всякий раз, когда у меня есть объект Foo, ребенок ForeignKey всегда является экземпляром базы - я понимаю, что это, как работает Django , На данный момент я добавил метод downcast() в Base (см. Выше). Я не возражаю против жесткого кодирования возможных производных типов.

Что бы я хотел, так или иначе централизовать автоматическое понижение в Foo. Я добавил это наследование на несколько таблиц в существующий код, и я продолжаю находить экземпляры, где код действительно нуждается в его подавлении - поэтому я должен тогда вручную опустить его локально в коде.

Я использовал пакет django-polymorphic, но он дает мне некоторые побочные эффекты. Я не знаю, как/и не хочу иметь дело (например, я не могу удалить строки - получил некоторую ошибку в opts.pk Нет в глубине кода запроса.)

Так что я задавался вопросом - поместил бы что-то в __init __() (после вызова базового класса init), хорошо? Есть ли побочные эффекты, о которых я не думаю? Кажется, что это может быть проблемой при создании новых экземпляров с нуля.

def __init__(*args, **kwargs): 
    super(Base, self).__init__(*arg, **kwargs) 
    self.child = self.child.downcast() 

Должен ли я просто переименовать ребенка?

class Foo(Model): 
    child_poly = ForeignKey(Base) # was child 
    @property 
    def child(self): 
     return self.child_poly.downcast() 

Это может быть проблемой при создании Foo() с нуля. Я не могу сказать Foo (child = c).

Есть ли лучший подход? Не ищите общего полиморфного решения/mixin - не после попытки отладки django и обнаружения удаления django-polymorphic исправления проблемы удаления.

+1

Какую версию django-polymorphic вы попробовали? Этот https://github.com/chrisglass/django_polymorphic, кажется, довольно хорошо поддерживается. Если бы это было, я бы предложил вам опубликовать проблему/ошибку, с которой вы столкнулись. Если вы уже это сделали, мои извинения. – mtnpaul

+0

Возможно, вы захотите попробовать [InheritanceManager] (https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager) форму django-model-utils, если вам нужно все, что вам нужно. –

+0

Это был django_polymorphic-0.5.tar.gz. Я не подавал ошибку - хотелось бы, но все, что я получил, это трассировка стека в коде запроса django. Я проследил это и не чувствовал, что могу действительно откликнуться на ошибку с правильным описанием того, что происходит, за исключением того, что я бы получил opts.pk - None, когда django получал доступ к opts.pk.name. – rrauenza

ответ

1

В конце концов я вернулся к джанго-полиморфному и не имел проблемы, с которой я столкнулся раньше.

Смежные вопросы