J'utilise SQLalchemy, et de nombreuses classes de mon modèle d'objet ont les deux mêmes attributs: ID et (clé entière et principale) et nom (une chaîne). J'essaie d'éviter de les déclarer dans chaque classe comme si: Qu'est-ce qu'un bon moyen de le faire? J'ai essayé d'utiliser des métaclasses mais cela n'a pas encore fonctionné. P> p>
3 Réponses :
Vous pouvez facturer vos attributs communs dans un Classe MixIn < / a> et multiplier le hériter à côté de edit strong>: Vous pourriez penser que cela entraînerait une déclaratif_base () code>:
C1 CODE> et
C2 CODE> Partage des mêmes objets CODE> COLONNE CODE>, mais comme indiqué dans le sqlalchemy docs , les objets de colonne sont copiés em> à partir d'une classe de mixine. J'ai mis à jour l'échantillon de code pour démontrer ce comportement. P> p>
Malheureusement, cela ne va pas fonctionner car l'attribut d'identification serait alors partagé entre toutes les sous-classes de IDNAMEMIXIN. Dans SQLALCHÉMY, chaque classe doit avoir son propre identifiant (un objet nouvellement créé de la colonne de classe).
Ah très cool !! Merci. Maintenant, si seulement je pouvais faire quelque chose à propos du nom __ __ code>, ce qui doit certainement être unique :) Mais j'aime votre approche avec la classe Mixin mieux que ma modification de la métaclasse.
Je pense que je l'ai eu pour travailler.
J'ai créé une métaclasse qui découle de la CRISTATIVEMÈME et a fait que la métaclasse de C1 et C2. Dans cette nouvelle métaclasse, j'ai simplement dit p> et il semble fonctionner correctement. P> p>
Pourriez-vous également utiliser la méthode de la copie de la colonne? De cette façon, les champs peuvent être définis indépendamment des tables et ces champs réutilisés ne sont que du champ. Copy () - Ed.
id = Column(Integer, primary_key = True) name = Column(String) class C1(declarative_base()): id = id.copy() name = name.copy() #... class C2(declarative_base()): id = id.copy() name = name.copy() #...
Quelqu'un sache comment modifier les propriétés de ces colonnes dans différentes classes de table, alors? C'est-à-dire que si l'identifiant n'est pas primaire en C1, mais est primaire en C2, comment faire cette distinction sans la répétition que nous évitons?