Ошибка в моделях, TypeError: on_delete должен вызываться - PullRequest
0 голосов
/ 29 апреля 2020

Когда я запускаю следующую команду:

python manage.py makemigrations

У меня появляется эта ошибка:


  File "/home/user/project/myvirt/forum/boards/models.py", line 9, in <module>
    class Topic(models.Model):
  File "/home/user/project/myvirt/forum/boards/models.py", line 12, in Topic
    board = models.ForeignKey(Board, related_name='topics', on_delete='cascade')
  File "/usr/local/lib/python3.7/dist-packages/django/db/models/fields/related.py", line 801, in __init__
    raise TypeError('on_delete must be callable.')
TypeError: on_delete must be callable.

Мой контент models.py:


from django.db import models
from django.contrib.auth.models import User
# Create your models here.

class Board(models.Model):
    name = models.CharField(max_length=30, unique=True)
    description = models.CharField(max_length=100)

class Topic(models.Model):
    subject = models.CharField(max_length=255)
    last_updated = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, related_name='topics', on_delete='cascade')
    creator = models.ForeignKey(User, related_name='topics', on_delete='cascade')

class Post(models.Model):
    message = models.TextField(max_length=4000)
    topic = models.CharField(Topic, related_name='posts', on_delete='cascade')
    created_by = models.CharField(User, related_name='posts', on_delete='cascade')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_by = models.CharField(User, related_name='posts', on_delete='cascade')
    updated_at = models.DateTimeField(null=True)

This является упражнением в примере форума и, похоже, проблема с on_delete='cascade'.

Обновление:

Я использую Django версия 3.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Проблема в том, что в полях вашей модели вы назначаете строку для on_delete. (-> `on_delete = 'cascade')

Что вам нужно сделать, это назначить (как говорит ошибка), как CASCADE.

Пример:

from django.db import models

class MyModel(models.Model):
    my_relation = models.ForeignKey(
        MyOtherModel,
        on_delete=models.CASCADE,
    )
    ...

Более того: Вы устанавливаете related_name=XYZ на все свои поля. Это неверно, потому что related_name может быть назначено только полям, которые обрабатывают отношения, например ForeignKey.

Также см. docs .

1 голос
/ 29 апреля 2020

Сообщение об ошибке on_delete must be callable указывает, что оно должно вызываться вместо строки.

В соответствии с Django официальной документацией ForeignKey , и вот пример:

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
...