Getting TypeError: init() missing 1 required positional argument: 'on_delete' when trying to add parent table after child table with entries

I have two classes in my sqlite database, a parent table named Categorie and the child table called Article. I created first the child table class and addes entries. So first I had this:

    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

And after I have added parent table, and now my models.py looks like this:

    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

So when I run python manage.py makemigrations <my_app_name>, I get this error:

    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'

I've seen some similar issues in stackoverflow, but it seems to not be the same problem: init() missing 1 required positional argument: 'quantity'

You can change the property categorie of the class Article like this:

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

and the error should disappear.

Eventually you might need another option for on_delete, check the documentation for more details:

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

EDIT:

As you stated in your comment, that you don't have any special requirements for on_delete, you could use the option DO_NOTHING:

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

From: stackoverflow.com/q/44026548

Back to homepage or read more recommendations: