Общие отношения django "один к одному" с каскадным удалением
Я пытаюсь подражать модели наследования, используя общие отношения django. Пока что это то, что я придумал:
class Base(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
... other stuff
class Meta:
unique_together = ("content_type", "object_id")
class SubClass1(models.Model):
... properties for this class
_base = generic.GenericRelation(Base)
@property
def base(self):
return self._base.all()[0]
Из того, что вы можете увидеть здесь (надеюсь, по крайней мере), SubClass1
должны иметь личные отношения с Base
Вот почему я прошел всю работу по созданию этого _base
поле, а затем покрывая его base
имущество. Наличие этого общего отношения автоматически соединит каскадные удаления, что я и хочу (и у меня есть post-delete
сигнал, который соединит удаление с другого направления).
Может быть любое количество подклассов от Base
и то, что заставляет меня чувствовать себя грубым, это необходимость копировать и вставлять _base
и его свойство покрытия. У меня также есть собственный менеджер объектов, который идет с этим, и потенциально другие вещи, которые по существу должны вести себя одинаково в каждом подклассе Base
,
Есть ли хороший способ инкапсулировать эту общую функциональность, чтобы мне не приходилось копировать и вставлять ее для каждого подкласса?
1 ответ
Почему бы не иметь BaseSubClass
, а потом наследовать от этого. Итак, основываясь на вашем примере:
class BaseSubClass(models.Model):
_base = generic.GenericRelation(Base)
class Meta:
abstract = True
@property
def base(self):
return self._base.all()[0]
class SubClass1(BaseSubClass):
# fields