J'étais inquiet pour on_delete lorsque j'ai essayé de définir une clé externe dans Django, alors je l'ai résumé.
Je suis en train de créer une application Web pour organiser des tournois de jeux, donc j'avais besoin d'une table pour connecter le tournoi avec les participants.
J'ai donc créé un modèle dans lequel la table des participants a la table du tournoi et la table des utilisateurs avec des clés externes.
models.py
from django.db import models
from django.contrib.auth.models import User
from games.models import Game
class Participations(models.Model):
Game = models.ForeignKey(Game)
User = models.ForeignKey(User)
L'erreur suivante se produit pendant la migration
Traceback (most recent call last):
Game = models.ForeignKey(Game)
TypeError: __init__() missing 1 required positional argument: 'on_delete'
Je me suis fâché sans on_delete.
La cause est simple, mais c'est parce que on_delete n'est pas spécifié dans l'argument.
Au fait, il semble qu'il soit devenu obligatoire à partir de Django 2.0.
Quand je regarde la note de publication officielle, ça dit comme ça.
The on_delete argument for ForeignKey and OneToOneField is now required in models and migrations.
** Traduire ** Les arguments ForeignKey et OneToOneField on_delete sont désormais requis pour la modélisation et la migration.
Note de publication de Django 2.0
Alors, qu'est-ce que on_delete?
C'est le comportement lorsque l'objet référencé est supprimé.
https://docs.djangoproject.com/ja/3.0/ref/models/fields/
Ci-dessous un bref résumé basé sur la référence officielle
on_delete=models.CASCADE Ze qui supprime toutes les données de la clé externe!
on_delete=models.PROTECT Ze qui rend impossible la suppression!
on_delete=models.SET_NULL S'il est supprimé, je mettrai NULL à la place! Définissez null = true lors de l'utilisation de ce Ze!
on_delete=models.SET_DEFAULT Ze pour remplacer la valeur par défaut lors de la suppression!
on_delete=models.SET(hogehoge) S'il est supprimé, vous pouvez appeler une fonction, etc. et entrer une valeur arbitraire Ze!
on_delete=models.DO_NOTHING Ne fais rien Ze!
C'est une vie de migration riche avec on_delete qui convient à votre objectif Ze!
Recommended Posts