Общие отношения 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
Другие вопросы по тегам