Maison >base de données >tutoriel mysql >Comment interagir avec plusieurs tables temporaires avec des schémas identiques dans Django ?
Lorsque vous travaillez avec des bases de données MySQL, il est possible d'avoir plusieurs tables temporaires avec des schémas identiques mais des noms dynamiques. Pour interagir avec ces tables dans Django, vous pouvez utiliser une fonction d'usine qui génère des modèles avec une valeur db_table spécifiée.
Le code suivant montre comment créer dynamiquement un modèle basé sur un nom de table de base de données :
<code class="python">def getModel(db_table): class MyClass(models.Model): # Define model fields here... class Meta: db_table = db_table return MyClass</code>
En appelant getModel(db_table), vous obtenez un modèle qui utilise le nom de db_table spécifié. Par exemple, pour récupérer les données de la table 29345794_table, vous pouvez utiliser :
<code class="python">newClass = getModel('29345794_table') results = newClass.objects.filter(...)</code>
Initialement, Django met en cache les informations de métaclasse pour chaque classe en fonction de son nom . Pour contourner cette limitation, vous pouvez utiliser une métaclasse personnalisée qui modifie le nom de la classe au moment de l'exécution :
<code class="python">def getModel(db_table): class MyClassMetaclass(models.base.ModelBase): def __new__(cls, name, bases, attrs): name += db_table return models.base.ModelBase.__new__(cls, name, bases, attrs) class MyClass(models.Model): __metaclass__ = MyClassMetaclass class Meta: db_table = db_table return MyClass</code>
Au lieu de créer de nouveaux modèles à chaque fois, vous pouvez modifier dynamiquement l'attribut db_table d'un modèle existant :
<code class="python">MyModel._meta.db_table = '10293847_table' results = MyModel.objects.all()</code>
Cette approche vous permet de basculer dynamiquement entre différents noms de table pour le même modèle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!