2010-06-22 11 views
6

Ich habe eine Legacy-Datenbank mit einer Tabelle, die eine Viele-zu-Viele-Beziehung speichert, aber ohne eine einzige Primärschlüsselspalte. Gibt es irgendeine Möglichkeit, Django davon zu überzeugen, es trotzdem zu benutzen?Django: Viele-zu-viele durch eine Tabelle mit (nur) zusammengesetztem Schlüssel

Schematisch:

Product 1<---->* Labeling *<---->1 Label 

Die Labeling Tabelle verwendet (product_id,label_id) als Verbindung Primärschlüssel, und ich sehe keinen Weg Django darüber zu informieren. (Nur through gibt mir Unknown column 'labeling.id' in 'field list'.)

Muss ich auf benutzerdefinierte SQL zurückgreifen? Oder fehlt mir etwas?

Antwort

1

Wenn Sie eine unique_together zum Modell für die many-to-many-Tabelle hinzufügen, wird Django diese Spalten anstelle eines Primär erwartet Schlüssel genannt id.

+0

Nicht wirklich, es wird 'ID' Feld auch erstellen. Es gibt einen [Workaround] (https://stackoverflow.com/a/28712960/52499). Aber in meinem Fall entschied ich mich, mit einem zusätzlichen 'id'-Feld zu gehen. Keine Legacy-Tabellen –

1
+0

Ich habe nicht erwartet, dass es ... aber es tat: 'unique_together' ist alles was benötigt wird, um Django zu stoppen, die nach einer Primärschlüsselspalte fragt. Wenn Sie das (oder Wörter in diesem Sinne) zu Ihrer Antwort hinzufügen, kann ich es akzeptieren. (Afaik 'db_index' ist irrelevant: es gilt nur für einzelne Felder.) – Tikitu

+0

Es stimmt zwar, dass Django sich nicht mehr beschweren wird, wenn du unique_together * hinzufügst, aber es ist immer noch nicht voll funktionsfähig. Zum Beispiel delete (Model.Delete()) auf dem Modell, das in den through-Parametern angegeben ist, ausgenommen. Ich bin Experte genug, um dies als Antwort zu geben, denn was ich lese, Django unterstützt nicht, einen Primärschlüssel auf einem Modell zu haben. – Boaz

+0

@Tikitu Danke, danke, danke! Ich riss mir die Haare aus und versuchte herauszufinden, wie Django keine 'primary_key = True'-Spalte für meine veraltete Nur-Lese-Datenbank mit mehreren Viele-zu-Viele-Zwischentabellen benötigt. Ich wusste von 'unique_together', aber ich wusste nicht, dass es Djangos Beharren auf' primary_key = True' verschwinden lassen würde. Nun, da Django 1.8 tatsächlich Warnungen über das Setzen von 'primary_key = True' auf einem ForeignKey-Feld ausgibt, wurde dies plötzlich sehr wichtig. – CoreDumpError

Verwandte Themen