У меня есть эти модели.Предотвращение каскадирования Django для суперкласса
# models.py
class A(models.Model):
name = models.CharField('Name', max_length=50)
class B(A):
a_ptr = models.OneToOneField('A', primary_key=True, editable=True, parent_link=True)
number = models.CharField('Number', max_length=15)
Отношения я пытаюсь захватить то, что каждый B также А, но А не обязательно B. Я мог бы использовать ForeignKey вместо этого, но я бы предпочел, чтобы обратиться к унаследованным полей на B, например, B.name.
Способ, которым я намереваюсь использовать эти модели, состоит в том, что A всегда будет создаваться в первую очередь. И всякий раз, когда создается экземпляр B, он должен будет выбрать существующий (но еще не принятый) B.
Это работает довольно хорошо до сих пор, но единственная проблема, с которой я столкнулся, - это каскадное удаление. С помощью этой настройки удаление B приведет к удалению соответствующего A (или, по крайней мере, это то, что происходит с администратором django). Как я могу отключить этот каскад?
Мне известно о атрибуте on_delete, но если я установил это, скажем DO_NOTHING в поле a_ptr, это будет иметь эффект, позволяющий B существовать без соответствующих A, а не наоборот.
Как это сделать?
[Этот ответ] (http://stackoverflow.com/questions/3711191/django-deleting-object-keeping-parent) довольно умный (переключите 'b.a_ptr', чтобы указать на другой экземпляр перед удалением). Я не знаю, есть ли менее хакерский путь. – Alasdair