2015-02-25 18 views
19

Ich habe eine Legacy-Db-Tabelle, die zusammengesetzten Primärschlüssel hat. Ich glaube nicht, dass ich in der Lage sein werde, die Struktur so zu ändern, dass sie einen Ersatzschlüssel enthält, denn es gibt Code, der diese Tabelle verwendet. Und im Django kann ich diese Tabelle nicht verwenden, da sie keinen Primärschlüssel (nicht zusammengesetzt) ​​hat.Composite-Primärschlüssel in Django

Unterstützen Django-Modelle zusammengesetzte Primärschlüssel? Wenn nicht, gibt es eine Problemumgehung, ohne die Struktur der Tabelle zu ändern?

P.S. Ich benutze postgresql.

Antwort

29

Versuchen unter Code ähnlich:

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField(primary_key=True) 
    key2 = models.IntegerField() 

oder wenn Sie wollen nur einzigartige Mischfelder:

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField() 
    key2 = models.IntegerField() 

EDIT: Ich möchte darauf hinweisen, dass es ein Problem mit diesem Ansatz, wenn es 3 Spalten. Aktualisierungsabfragen funktionieren nicht, weil sie versucht, die Felder, die eindeutig zusammen sind und offensichtlich fehlschlagen, zu aktualisieren (setzt pk-Felder gleich nach "SET").

+0

Warum funktioniert es überhaupt? – khajvah

+0

in Meta-Klasse jedes Tupel in 'unique_together'-Attribut, das bestimmt, dass gemischte Werte dieser Felder durch bestimmte Reihenfolge nicht duplizieren dürfen. – Mohsen

+0

Ich meine, wenn Sie 'key2 = models.IntegerField (unique = True)' 'erstellen, sollte das nicht bedeuten, dass' key2' für alle Werte eindeutig sein muss, nicht nur für ein einzelnes 'key1'? – khajvah