У меня есть что-то вроде этого:Джанго: понижающее приведение автоматически в многотабличного наследования/полиморфные таблиц
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 исправления проблемы удаления.
Какую версию django-polymorphic вы попробовали? Этот https://github.com/chrisglass/django_polymorphic, кажется, довольно хорошо поддерживается. Если бы это было, я бы предложил вам опубликовать проблему/ошибку, с которой вы столкнулись. Если вы уже это сделали, мои извинения. – mtnpaul
Возможно, вы захотите попробовать [InheritanceManager] (https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager) форму django-model-utils, если вам нужно все, что вам нужно. –
Это был django_polymorphic-0.5.tar.gz. Я не подавал ошибку - хотелось бы, но все, что я получил, это трассировка стека в коде запроса django. Я проследил это и не чувствовал, что могу действительно откликнуться на ошибку с правильным описанием того, что происходит, за исключением того, что я бы получил opts.pk - None, когда django получал доступ к opts.pk.name. – rrauenza