2016-03-03 12 views
6

tập tin models.py My chứa:Django on_delete = models.CASCADE không có tác dụng ở mức SQL

class User(models.Model): 
    email = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=100) 
    create_time = models.DateTimeField(auto_now_add=True) 

class Session(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    token = models.CharField(max_length=100, unique=True) 

Khi tôi lệnh python manage.py makemigrations và sau đó lệnh python manage.py sqlmigrate <app_name> <migration_name> tôi không thấy bất cứ điều gì mà nói "ON DELETE CASCADE ="

Tuy nhiên, việc di chuyển không hoạt động khi tôi nhập python manage.py migrate.

Bây giờ, nếu tôi truy cập bảng mysql (sử dụng SequelPro) và cố xóa hàng cho người dùng hiện có mục nhập phiên, tôi nhận được lỗi sau: "Một hàng không bị xóa." để đảm bảo rằng nội dung không thay đổi trong thời gian chờ đợi. Hãy kiểm tra Bảng điều khiển để biết các lỗi có thể có trong (các) khóa chính của bảng này! ".

Bây giờ, khi tôi chuyển đến bảng phiên và xóa các phiên của người dùng này và sau đó cố xóa hàng của người dùng khỏi bảng người dùng, nó sẽ xóa chính xác. Điều này cho thấy ON DELETE = CASCADE không thực sự hoạt động ở cấp MySQL.

Tôi làm cách nào để sửa?

Trả lời

13

Từ (tôi nhấn mạnh) docs:

ForeignKey.on_delete

When an object referenced by a ForeignKey is deleted, Django will emulate the behavior of the SQL constraint specified by the on_delete argument.

Django không thực sự thiết lập một ON DELETE điều khoản trong cơ sở dữ liệu. Nếu bạn cần, bạn có thể thêm một cách thủ công bằng cách sử dụng thao tác RunSQL. Đảm bảo sử dụng cùng tên chỉ mục hoặc giữ chỉ mục gốc hoặc bạn có thể gặp phải lỗi sau này.

+7

đó thật là một bummer :( –

Các vấn đề liên quan