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
Linda Hamiltonoriginal
2024-10-29 12:22:29861parcourir

 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>

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>

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

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>

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!

Déclaration:
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