unexpected positional on_delete missing init__ got argument python django django-models django-2.0

python - positional - typeerror__ init__ got an unexpected keyword argument on_delete



Obteniendo TypeError:__init__() falta 1 argumento posicional requerido: ''on_delete'' al intentar agregar una tabla primaria después de una tabla secundaria con entradas (8)

Aquí hay opciones disponibles si ayuda a alguien para on_delete

CASCADA, NO HACER NADA, PROTEGER, SET, SET_DEFAULT, SET_NULL

Tengo dos clases en mi base de datos sqlite, una tabla primaria llamada Categorie y la tabla secundaria llamada Article . Primero creé la clase de tabla secundaria y las entradas de suma. Así que primero tuve esto:

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

Y después de haber agregado la tabla principal, y ahora mi models.py ve así:

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

Entonces, cuando ejecuto python manage.py makemigrations <my_app_name> , obtengo este 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''

He visto algunos problemas similares en stackoverflow, pero parece que no es el mismo problema: __init __ () falta 1 argumento posicional requerido: ''cantidad''


Desde Django 2.0 se requiere on_delete :

user = models.OneToOneField (Usuario, on_delete = models.CASCADE)

Eliminará los datos de la tabla secundaria si se elimina el usuario. Para más detalles, consulte la documentación de Django.


Desde Django 2.0, el campo ForeignKey requiere dos argumentos posicionales:

  1. el modelo a mapear
  2. el argumento on_delete

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

Aquí hay algunos métodos que se pueden usar en on_delete

  1. CASCADA

Cascada elimina. Django emula el comportamiento de la restricción SQL ON DELETE CASCADE y también elimina el objeto que contiene ForeignKey

  1. PROTEGER

Evite la eliminación del objeto al que se hace referencia levantando ProtectedError, una subclase de django.db.IntegrityError.

  1. HACER NADA

No tomar ninguna medida. Si el backend de su base de datos impone integridad referencial, esto causará un IntegrityError a menos que agregue manualmente una restricción SQL ON DELETE al campo de la base de datos.

Puede encontrar más información sobre on_delete leyendo la documentación .


Desde Django 2.x, se requiere on_delete .

Documentación de Django

En desuso desde la versión 1.9: on_delete se convertirá en un argumento obligatorio en Django 2.0. En versiones anteriores, el valor predeterminado es CASCADE.


Esto funcionó para mí pip install django-csvimport --upgrade


Hasta Django 1.9, un modelo se vería así:

from django.db import models class Article(models.Model): category = models.ForeignKey(Category) title = models.CharField(max_length=55) # ... def __str__(self): return self.title

ForeignKey es un campo de Django para definir una relación de muchos a uno.

Hasta Django 1.9, el campo ForeignKey requería un solo argumento: el modelo para mapear.

Desde Django 2.0, el campo ForeignKey requiere dos argumentos posicionales :

1- el modelo a mapear

2-el argumento on_delete

Para una solución rápida de "falta 1 argumento posicional requerido: on_delete", actualice el modelo:

from django.db import models class Article(models.Model): category = models.ForeignKey(''Category'', on_delete=models.PROTECT) title = models.CharField(max_length=55) # ... def __str__(self): return self.title

Después de arreglar ForeignKey, podrá ejecutar migraciones sin ningún problema:

python manage.py migrate

Gracias a valentino


Puede cambiar la categorie de propiedad de la clase Article siguiente manera:

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

y el error debería desaparecer.

Eventualmente, podría necesitar otra opción para on_delete , consulte la documentación para obtener más detalles:

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

EDITAR:

Como indicó en su comentario, que no tiene requisitos especiales para on_delete , puede usar la opción DO_NOTHING :

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


Si está usando una clave extranjera, debe usar "on_delete = models.CASCADE", ya que eliminará la complejidad desarrollada después de eliminar el elemento original de la tabla primaria. Tan sencillo como eso.

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