Django 'on_delete' models?

 


When you get something like this with your old code.


File "<frozen importlib._bootstrap>", line 1014, in _gcd_import

File "<frozen importlib._bootstrap>", line 991, in _find_and_load

File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked

File "<frozen importlib._bootstrap>", line 671, in _load_unlocked

File "<frozen importlib._bootstrap_external>", line 783, in exec_module

File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed

File "/home/sites/vacaturestoday/permanentjob/models.py", line 97, in <module>

class JobApplication(models.Model):

File "/home/sites/vacaturestoday/permanentjob/models.py", line 100, in JobApplication

job = models.ForeignKey('PermanentJob')

TypeError: __init__() missing 1 required positional argument: 'on_delete'



When the object referenced by the ForeignKey is deleted, Django will emulate the behavior of the SQL constraint specified by the on_delete parameter. For example, if you have a nullable ForeignKey and you want it to be set to null when the referenced object is deleted:



https://docs.djangoproject.com/en/4.0/ref/models/fields/




CASCADE: When the referenced object is deleted, also delete the object referencing it (for example, when you delete a blog post, you may also want to delete comments). SQL equivalent: CASCADE.

PROTECT: Forbids deleting the referenced object. To delete it, you must manually delete all objects referencing it. SQL equivalent: RESTRICT.

RESTRICT: (Introduced in Django 3.1) PROTECT-like behavior that more accurately matches SQL's RESTRICT. (see django documentation example)

SET_NULL: Set the reference to NULL (requires the field to be nullable). For example, when you delete a user, you might want to keep his comment on a blog post, but say it was posted by an anonymous (or deleted) user. SQL equivalent: SET NULL.

SET_DEFAULT: Set the default value. SQL equivalent: SET DEFAULT.

SET(...): Set the given value. This is not part of the SQL standard and is handled entirely by Django.

DO_NOTHING: Probably a really bad idea, as this creates integrity issues in your database (referencing objects that don't actually exist). SQL equivalent: no operation.


So, you have to update your model ForeignKey.

Comments