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.
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
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!