Ошибка ограничения Django ForeignKey - PullRequest
0 голосов
/ 08 декабря 2018

Я создаю простой блог-сайт с многопользовательским функционалом, используя фреймворк django.В моем проекте, если администратор удаляет какого-либо пользователя, все блоги этого пользователя не должны удаляться, я попытался использовать

models.ForeignKey(django.contrib.auth.models.User,on_delete=models.CASCADE)

, но он, очевидно, удаляет все блоги, если администратор удаляет пользователя.Кто-нибудь может мне помочь?Заранее благодарен ...

1 Ответ

0 голосов
/ 08 декабря 2018

Это связано с on_delete=CASCADE.Это означает, что если объект, на который ссылается ForeignKey, будет удален, то он также должен удалить и ссылающийся объект.Такое CASCADE может, таким образом, привести к большому количеству объектов, которые будут удалены, поскольку удаление объектов может фактически инициировать другие удаления и т. Д.

В перечислены несколько параметров.документация :

  1. CASCADE: удалить ссылающиеся объекты;
  2. PROTECT: не разрешать удалятьпользователь, если есть объекты, которые ссылаются на пользователя;
  3. SET_NULL: установите на NULL (None в Python), в этом случае нужно установить null=True в конструкторе ForeignKey(..);
  4. SET_DEFAULT: возвращает ForeignKey значение default=...;
  5. SET(..): установите ForeignKey на некоторое значение, которое передается конструктору SET(..) (можно также использовать вызываемый);
  6. DO_NOTHING: здесь мы сохраняем ссылку, но некоторый сервер базы данных не допускает это, поскольку эти проверки проверяют FOREIGN KEY ограничения.

Таким образом, мы можем, например, использовать SET_NULL и, таким образом, установить authorдо NULL / None в случаемы удаляем автора:

from django.db import models
from django.conf import settings

class Post(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        <b>null=True</b>,
        <b>on_delete=models.SET_NULL</b>
    )
    # ...

Также лучше использовать settings.AUTH_USER_MODEL, поскольку, если вы позже измените модель User, это автоматически изменит ссылку на новую модель.

...