[PYTHON] Comment créer un enregistrement en collant une relation au modèle source d'héritage dans le modèle hérité par Django

Aperçu

Comment créer un enregistrement en collant une relation au modèle source d'héritage dans le modèle hérité par Django

Lors du collage d'une relation avec le modèle source d'héritage, le modèle source d'héritage peut être remplacé par une valeur non voulue. Je vais l'écrire avec des mises en garde et des solutions de contournement!

~~ J'étais confus par le comportement de Django ~~ J'aime Django

Environnement où l'opération a été confirmée

Python==3.7.4 Django=2.2.3

Conclusion

Donnez un objet Model au champ {model name} _ptr qui est implicitement défini lors de l'héritage du modèle

À ce stade, si vous exécutez Model.save () ou Model.objects.create (), le modèle hérité peut être changé en une valeur involontaire, utilisez donc .save_base (raw = True). Faire

#Définition du modèle
from django.db import models

    
class Parent(models.Model):
    parent_column = models.CharField(max_length=255)

#Modèle héritant du ParentModel
class Child(Parent):
    child_column = models.CharField(max_length=255)
    
  

parent = Parent.objects.create(
    parent_column="Text"
)
#Créer un modèle de destination d'héritage avec une relation attachée au modèle source d'héritage créé
child = Child(
    parent_ptr=parent,
    child_column="Text"
)
child.save_base(raw=True)

Que se passe-t-il si vous héritez du modèle

Si vous héritez de Model, les champs du modèle héritant sont également hérités.

Dans la base de données, la table enfant n'a pas de colonne_parent et une clé externe à la table parent est créée

class Child(Parent):
    child_colum = models.CharField(max_length=255)

    #Parent hérité_la colonne existe également
    # parent_colum = models.CharField(max_length=255)

    #Implicitement, la source d'héritage OneToOneField est également définie
    # parent_ptr = models.OneToOneField(
    #     Parent,
    #     parent_link=True
    # )

[Attention] Afin de ne pas affecter le modèle hérité

Comme note

La valeur de Parent.parent_column sera vide si vous procédez comme suit:


parent = Parent.objects.create(parent_column="Text")
Child.objects.create(
    parent_ptr=parent,
    child_column="Text"
)

""Retour
print(Parent.objects.get(pk=parent.pk).parent_column)

c'est, Se produit parce que parent_link = True est défini dans le champ parent_ptr de ChildModel

En conséquence, le parent de parent_ptr = parent est mis à jour au moment de la création. ChildModel définit également un champ parent_column hérité

En créant sans spécifier de valeur dans ce champ, il sera mis à jour côté parent. Pour éviter cela

En utilisant Model.save_base (raw = True), vous pouvez insérer le modèle hérité sans mettre à jour le modèle hérité.

Recommended Posts

Comment créer un enregistrement en collant une relation au modèle source d'héritage dans le modèle hérité par Django
Comment créer une API Rest dans Django
Lire la source Python-Markdown: Comment créer un analyseur
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
Comment créer un fichier JSON en Python
Comment identifier de manière unique la source d'accès dans la vue de classe générique Django
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Comment obtenir le "nom" d'un champ dont la valeur est limitée par l'attribut choice dans le modèle Django
Comment obtenir plusieurs objets de modèle au hasard dans Django
Comment créer un sous-menu avec le plug-in [Blender]
Comment utiliser le modèle appris dans Lobe en Python
Comment référencer des fichiers statiques dans un projet Django
Comment écrire une validation personnalisée dans Django REST Framework
Comment utiliser la méthode __call__ dans la classe Python
Une histoire qui rend le débogage de modèle plus facile à voir dans l'environnement Django + SQLAlchemy
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Créer une nouvelle liste en combinant des éléments en double dans la liste
Dans Django, comment abréger la longue chaîne de caractères affichée au milieu ...
[Django] Que faire quand il y a de nombreux champs dans le modèle que vous souhaitez créer
Comment retourner les données contenues dans le modèle django au format json et les mapper sur le dépliant
[sh] Comment stocker les résultats de l'exécution de la commande dans des variables
Comment déterminer l'existence d'un élément sélénium en Python
Comment obtenir toutes les valeurs possibles dans une expression régulière
Comment vérifier la taille de la mémoire d'une variable en Python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Comment créer une grande quantité de données de test dans MySQL? ??
Comment déployer une application Django sur heroku en seulement 5 minutes
Créez une fonction pour obtenir le contenu de la base de données dans Go
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Étapes pour créer un projet Django
Comment créer un package Conda
Comment créer un pont virtuel
Comment refléter CSS dans Django
Comment créer un Dockerfile (basique)
Comment créer un fichier de configuration
Créer un bot LINE avec Django
Notez que vous souhaitez décorer manuellement les paramètres passés dans le formulaire du modèle Django élément par élément
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Comment spécifier un fichier .ui dans la boîte de dialogue / interface graphique du widget dans PySide
[NNabla] Comment ajouter une couche de quantification à la couche intermédiaire d'un modèle entraîné
Ajout d'une fonction pour enregistrer les décalages souhaités dans la table des décalages Django
Pour trouver le nom de la vue avec l'espace de noms à partir de l'URL (path_info) dans Django
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production
Créer un enregistrement avec des pièces jointes dans KINTONE à l'aide du module de requêtes Python
Comment créer un dossier git clone
Comment vérifier la version de Django
Comment supprimer des sessions expirées dans Django
Créez un modèle pour votre planning Django
Comment obtenir stacktrace en python
Comment créer un référentiel à partir d'un média
Comment faire des événements envoyés par le serveur dans Django
Implémenter un modèle utilisateur personnalisé dans Django
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python