Maison > base de données > tutoriel mysql > Les modèles Django avec des clés étrangères peuvent-ils exister dans différentes bases de données ?

Les modèles Django avec des clés étrangères peuvent-ils exister dans différentes bases de données ?

Linda Hamilton
Libérer: 2024-10-29 12:22:29
original
854 Les gens l'ont consulté

 Can Django Models with Foreign Keys Exist in Different Databases?

Utilisation de modèles Django avec des clés étrangères dans différentes bases de données

Dans Django, vous pouvez créer des modèles qui résident dans différentes bases de données. Cependant, il existe des limites lorsqu'il s'agit d'utiliser des relations de clé étrangère entre ces modèles.

Considérons l'exemple suivant :

<code class="python"># in 'urls' database
class LinkModel(models.Model):
    host_id = models.IntegerField()
    path = models.CharField(max_length=255)

# in default database
class NewsModel(models.Model):
    title = models.CharField(max_length=50)
    link = models.ForeignKey(LinkModel)</code>
Copier après la connexion

Après avoir configuré votre routeur de base de données, vous pouvez rencontrer une erreur lorsque attribuer la clé étrangère :

<code class="python">newsItem.link = LinkModel.objects.using('urls').get(id=1)
# Cannot assign "LinkModel: /": instance is on database "default", value is on database "urls"</code>
Copier après la connexion

Cela est dû au fait que Django ne prend pas en charge les relations de clés étrangères entre bases de données. Les clés étrangères et les relations plusieurs-à-plusieurs doivent être internes à une seule base de données.

Dépannage d'un bug

Si vous rencontrez cette erreur même si vous avez partitionné correctement vos modèles, cela peut être dû à un bug dans la classe ForeignKey de Django. Pour le résoudre, vous pouvez appliquer un correctif à votre projet :

In validate() method

# Old Code
assert target._database == self.opts.db

# New Code
assert target._database == self.opts.db or target._database is None
Copier après la connexion

Solution

Pour éviter les limitations inter-bases de données, vous pouvez utiliser une alternative approche. Envisagez de créer un modèle qui résume la relation de clé étrangère, tel que :

<code class="python">class AbstractLinkModel(models.Model):
    host_id = models.IntegerField()
    path = models.CharField(max_length=255)

class LinkModel(AbstractLinkModel):
    class Meta:
        db_table = 'links'
        app_label = 'testapp'

class NewsModel(models.Model):
    title = models.CharField(max_length=50)
    link = models.ForeignKey(AbstractLinkModel)</code>
Copier après la connexion

En utilisant un modèle de base abstrait pour définir la relation de clé étrangère, vous pouvez créer plusieurs sous-classes spécifiques à la base de données du modèle abstrait. Cela vous permet de maintenir les relations tout en partitionnant vos données sur plusieurs bases de données.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal