Heim > Datenbank > MySQL-Tutorial > Können Django-Modelle mit Fremdschlüsseln in verschiedenen Datenbanken existieren?

Können Django-Modelle mit Fremdschlüsseln in verschiedenen Datenbanken existieren?

Linda Hamilton
Freigeben: 2024-10-29 12:22:29
Original
854 Leute haben es durchsucht

 Can Django Models with Foreign Keys Exist in Different Databases?

Django-Modelle mit Fremdschlüsseln in verschiedenen Datenbanken verwenden

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 Login kopieren

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>
Nach dem Login kopieren

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.

Fehlerbehebung bei einem Fehler

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
Nach dem Login kopieren

Solution

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage