2015-02-25 16 views
19

Ho una tabella db legacy che ha una chiave primaria composita. Non credo che sarò in grado di modificare la struttura per includere una chiave surrogata, in quanto vi è del codice scritto che utilizza quella tabella. E in django, non posso usare quella tabella, poiché non ha una chiave primaria (non composita).Chiave primaria composita in django

I modelli di django supportano chiavi primarie composite? In caso contrario, c'è qualche soluzione alternativa senza modificare la struttura del tavolo?

P.S. Sto usando postgresql.

risposta

29

Prova simile sottostante Codice:

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

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

oppure se desideri solo unici campi misti:

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

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

EDIT: Vorrei notare che c'è un problema con questo approccio se ci sono 3 colonne. Le query di aggiornamento non funzionano perché provano ad aggiornare (mette i campi pk subito dopo "SET") i campi che sono univoci insieme e ovviamente falliscono.

+0

Perché funziona anche? – khajvah

+0

in Meta class ogni tupla nell'attributo 'unique_together' che determina che i valori misti di questi campi per ordine determinato non devono essere duplicati. – Mohsen

+0

Voglio dire, quando crei 'key2 = models.IntegerField (unique = True)', non dovrebbe implicare che 'key2' deve essere univoco per tutti i valori non solo per un singolo' key1'? – khajvah

Problemi correlati