общие отношения django «один-к-одному» с каскадным удалением - PullRequest
4 голосов
/ 29 сентября 2011

Я пытаюсь эмулировать модель наследования, используя общие отношения 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 Ответ

2 голосов
/ 03 октября 2011

Почему бы не иметь 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
...