Django. on_delete.model.SET() - установить ссылку на объект в виде функции с параметрами

В описании модели одно из полей представляет ForeignKey-ссылку на другой объект. Параметр поля value в подстановке on_delete = models.SET(value) может быть как значением, так и ссылкой на фукцию.

В данном случае необходимо в этой фукции установить параметр self чтобы вычислить номер привязываемого объекта.

Модель данных представляет собой web-страницу с контентом различного типа. Объекты контента на странице имеет некоторый порядок, реализованный односторонней привязкой к предыдущему объекту. Если какойто из объектов удаляется в ходе редактироваия страницы то следующий за ним объект должен привязаться к предыдущему относительно удаляемого, т.е. по принципу односвязного списка.

models.py

class Page(models.Model):
    """ Страница с контентом. """
    title = models.CharField('Заголовок', max_length=256)
    content = models.ManyToManyField('Content')
    # ...

class Content(models.Model):
    """ Модель контента страницы Page. """
    # корневой объект контента на странице
    is_root = models.BooleanField('Начальный?', default=False)
    # ссылка на предыдущий контент страницы
    previous = models.ForeignKey(
        'self'
        , null=True
        , default=None
        , related_name='next'
        , on_delete=models.SET(get_previous(self))
    )
    # ...  

Здесь поле previous является ссылкой на собственный объект - предыдущий контент. В случае удаления связанного объекта необходима перепривязка.

Я пытаюсь реализовать перепривязку с помощью функции get_previous(self), чтобы по объектуself узнать страницу и в ней перепривязать объекты контента.

def get_previous(self):
    """ Возвращает ссылку на другой предыдущий контент после удаления связанного. """
    # ...
    return pk

Проблема.

Параметр self в контексте on_delete = get_previous(self) не распознаётся Django - Unresolved reference 'self'.

Каким способами можно обойти эту ошибку?


Ответы (1 шт):

Автор решения: Миша

self не распознаётся потому что у вас он ни где не передан. Попробуйте реализовать ваш функционал в методе класса, где уже будет self. К примеру:

class Test:
    ...
    
    def method(self):
        return ...
→ Ссылка