In Django können Sie Modelle erstellen, die sich in verschiedenen Datenbanken befinden. Allerdings gibt es Einschränkungen bei der Verwendung von Fremdschlüsselbeziehungen zwischen diesen Modellen.
Betrachten Sie das folgende Beispiel:
<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>
Nach dem Einrichten Ihres Datenbankrouters kann es zu einem Fehler kommen Zuweisen des Fremdschlüssels:
<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>
Dies liegt daran, dass Django keine datenbankübergreifenden Fremdschlüsselbeziehungen unterstützt. Fremdschlüssel und Viele-zu-Viele-Beziehungen müssen intern zu einer einzelnen Datenbank gehören.
Wenn dieser Fehler auftritt, obwohl Sie eine Partitionierung durchgeführt haben Wenn Ihre Modelle korrekt funktionieren, liegt möglicherweise ein Fehler in der ForeignKey-Klasse von Django vor. Um das Problem zu beheben, können Sie einen Patch auf Ihr Projekt anwenden:
In validate() method # Old Code assert target._database == self.opts.db # New Code assert target._database == self.opts.db or target._database is None
Um die datenbankübergreifenden Einschränkungen zu vermeiden, können Sie eine Alternative verwenden Ansatz. Erwägen Sie die Erstellung eines Modells, das die Fremdschlüsselbeziehung abstrahiert, wie zum Beispiel:
<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>
Durch die Verwendung eines abstrakten Basismodells zur Definition der Fremdschlüsselbeziehung können Sie mehrere datenbankspezifische Unterklassen des abstrakten Modells erstellen. Dadurch können Sie die Beziehungen aufrechterhalten und gleichzeitig Ihre Daten auf mehrere Datenbanken verteilen.
Das obige ist der detaillierte Inhalt vonKönnen Django-Modelle mit Fremdschlüsseln in verschiedenen Datenbanken existieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!