L'histoire qu'il fallait spécifier on_delete après avoir spécifié la clé externe dans le changement de modèle de Django

J'étais inquiet pour on_delete lorsque j'ai essayé de définir une clé externe dans Django, alors je l'ai résumé.

Ce que je faisais

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)

Qu'est-il arrivé

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.

Cause

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

Comment utiliser on_delete

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!

Résumé

C'est une vie de migration riche avec on_delete qui convient à votre objectif Ze!

Recommended Posts

L'histoire qu'il fallait spécifier on_delete après avoir spécifié la clé externe dans le changement de modèle de Django
L'histoire qu'il fallait spécifier on_delete après avoir spécifié la clé externe dans le changement de modèle de Django
Si vous souhaitez afficher la valeur à l'aide des choix du modèle dans le modèle Django
Comment changer l'apparence du champ de clé étrangère non sélectionné dans le formulaire modèle de Django
Comment spécifier un schéma dans les paramètres de la base de données Django
Comprendre le rendement Python Si vous mettez le rendement dans une fonction, elle se transforme en générateur
Que faire si vous obtenez moins zéro en Python
Si vous souhaitez affecter une exportation csv à une variable en python
Vérifiez si vous pouvez vous connecter à un port TCP en Python
Que faire si vous obtenez une erreur "Aucune version trouvée" sur pipenv
Faire de n'importe quelle clé la clé primaire dans le modèle Django
Si vous rencontrez une "erreur de décodage Unicode" en Python
Que faire si une erreur de décodage Unicode se produit dans pip
Lorsque vous voulez plt.save dans l'instruction for
Que faire si vous obtenez une erreur Impossible de récupérer le lien métallique pour le référentiel avec yum
[python] Comment vérifier si la clé existe dans le dictionnaire
Pourquoi l'instruction main () -if de Python est-elle attachée?
Une histoire sur la façon de spécifier un chemin relatif en python.
Changer la destination de sortie standard en un fichier en Python
Que faire si pip donne une DistributionError dans Homebrew
Comment importer des fichiers où vous le souhaitez en Python
Que faire si Combinaisons devient «couverture inconnue»
Que faire si une erreur 0xC0000005 se produit dans tf.train.start_queue_runners ()
Comment vérifier si une valeur existe dans un type d'énumération
Que faire si vous ne pouvez pas vous connecter en tant que root
Remède facile lorsque vous perdez votre paire de clés EC2
Que faire si vous vous fâchez contre les `` déclarations '' doivent être une liste 2D ... dans la flèche matplotlib
[Django] Que faire quand il y a de nombreux champs dans le modèle que vous souhaitez créer
Que faire si vous obtenez une erreur de remplacement obligatoire `get_config` lorsque vous essayez de model.save avec Keras