Как мы можем использовать on_update CASCADE в django? - PullRequest
0 голосов
/ 11 февраля 2020

Сценарий: В нашей схеме есть таблица элементов, в которой есть ссылки внешнего ключа на несколько таблиц для определенного атрибута в таблице элементов: member_id (который явно генерируется при создании элемента и уникален для каждого членом). Пример: таблица элементов

id member_id first_name last_name
-- --------- ---------- -------
12 xyzqfad   Test       Member

таблица транзакций

txn_id txn_value member_id
------ --------- --------------
425    500       xyzqfad

требование: Когда мы удаляем элемент, мы хотим изменить member_id другое значение

Конечное состояние: таблица членов

id  member_id   first_name  last_name
--  ---------   ----------  ------
12  MASKED12    ******      ******

таблица транзакций

txn_id txn_value member_id
------ --------- ---------
425    500       MASKED12

Проблема: Мы не можем изменить member_id из-за наличия внешнего ключа ссылки на member_id в других таблицах.

1 Ответ

1 голос
/ 11 февраля 2020

Django позволяет вам установить атрибут on_delete в связанном поле, чтобы вы могли указать, что должно произойти при удалении связанного объекта.

Когда объект, на который ссылается ForeignKey, будет удален, Django будет эмулировать поведение ограничения SQL, заданного аргументом on_delete.

В зависимости от того, что вы сказали , вы хотите использовать функциональность SET(), которая вызывает функцию для установки значения при удалении связанного объекта.

Пример взят из Django docs;

Установите для ForeignKey значение, переданное в SET(), или, если передано вызываемое, результат его вызова. В большинстве случаев передача вызываемого будет необходима, чтобы избежать выполнения запросов во время импорта models.py:

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models

def get_sentinel_user():
    return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )

В этом примере будет удален шаблон c " user ", который будет ссылкой на все объекты, где удален их пользователь.

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

...