2017-05-17 25 views
15

Tôi có hai lớp trong cơ sở dữ liệu sqlite, bảng cha có tên Categorie và bảng con được gọi là Article. Trước tiên tôi đã tạo lớp bảng con và thêm các mục nhập. Vì vậy, lần đầu tiên tôi đã này:Bắt Loại lỗi: __init __() thiếu 1 đối số vị trí bắt buộc: 'on_delete' khi cố gắng thêm bảng cha sau bảng con với mục nhập

class Article(models.Model): 
    titre=models.CharField(max_length=100) 
    auteur=models.CharField(max_length=42) 
    contenu=models.TextField(null=True) 
    date=models.DateTimeField(
     auto_now_add=True, 
     auto_now=False, 
     verbose_name="Date de parution" 
    ) 

    def __str__(self): 
     return self.titre 

Và bảng cha sau khi tôi đã thêm, và bây giờ models.py của tôi trông như thế này:

from django.db import models 

# Create your models here. 
class Categorie(models.Model): 
    nom = models.CharField(max_length=30) 

    def __str__(self): 
     return self.nom 


class Article(models.Model): 
    titre=models.CharField(max_length=100) 
    auteur=models.CharField(max_length=42) 
    contenu=models.TextField(null=True) 
    date=models.DateTimeField(
     auto_now_add=True, 
     auto_now=False, 
     verbose_name="Date de parution" 
    ) 
    categorie = models.ForeignKey('Categorie') 

    def __str__(self): 
     return self.titre 

Vì vậy, khi tôi chạy python manage.py makemigrations <my_app_name>, tôi nhận được lỗi này:

Traceback (most recent call last): 
    File "manage.py", line 15, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\core\management\__init__.py", line 354, in execute_from_command_line 
    utility.execute() 
    File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\core\management\__init__.py", line 330, in execute 
    django.setup() 
    File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\__init__.py", line 24, in setup 
    apps.populate(settings.INSTALLED_APPS) 
    File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\apps\registry.py", line 112, in populate 
    app_config.import_models() 
    File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django-2.0-py3.5.egg\django\apps\config.py", line 198, in import_models 
    self.models_module = import_module(models_module_name) 
    File "C:\Users\lislis\AppData\Local\Programs\Python\Python35-32\lib\importlib\__init__.py", line 126, in import_module 
    return _bootstrap._gcd_import(name[level:], package, level) 
    File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 665, in exec_module 
    File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
    File "C:\Users\lislis\Django\mon_site\blog\models.py", line 6, in <module> 
    class Article(models.Model): 
    File "C:\Users\lislis\Django\mon_site\blog\models.py", line 16, in Article 
    categorie = models.ForeignKey('Categorie') 
TypeError: __init__() missing 1 required positional argument: 'on_delete' 

Tôi đã nhìn thấy một số vấn đề tương tự trong lưu lượng truy cập stackoverflow, nhưng dường như không phải vấn đề tương tự: __init__() missing 1 required positional argument: 'quantity'

+1

phiên bản Mà của django bạn đang sử dụng? –

+1

Vì vậy, bạn đang bối rối về điều gì ở đây? Khi lỗi nói rõ ràng, ForeignKey có đối số bắt buộc, 'on_delete'. Xem [tài liệu] (https://docs.djangoproject.com/en/1.11/ref/models/fields/#foreignkey). –

+0

Tôi không cần tham số 'on_delete', bắt buộc phải không? – jochri3

Trả lời

25

Bạn có thể thay đổi thuộc tính categorie của lớp Article như thế này:

categorie = models.ForeignKey(
    'Categorie', 
    on_delete=models.CASCADE, 
) 

và lỗi sẽ biến mất.

Cuối cùng, bạn có thể cần một tùy chọn cho on_delete, kiểm tra tài liệu để biết thêm chi tiết:

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.ForeignKey

EDIT:

Như bạn đã nêu trong bình luận của bạn, rằng bạn không có bất kỳ đặc biệt các yêu cầu cho on_delete, bạn có thể sử dụng tùy chọn DO_NOTHING:

# ... 
on_delete=models.DO_NOTHING, 
# ... 
1

Kể từ Django 2.x, on_delete là bắt buộc.

Django Documentation

Deprecated since version 1.9: on_delete will become a required argument in Django 2.0. In older versions it defaults to CASCADE.

+0

Điểm tốt! Đó là một giá trị gia tăng cho bài viết của tôi. Cảm ơn bạn! – cezar

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