2015-02-25 25 views
19

Mam starszą tabelę db, która ma złożony klucz podstawowy. Nie sądzę, że będę w stanie zmienić strukturę tak, aby zawierała klucz zastępczy, ponieważ jest napisany jakiś kod, który używa tej tabeli. W django nie mogę używać tej tabeli, ponieważ nie ma ona klucza podstawowego (niekompozytowego).Podstawowy klucz złożony w django

Czy modele django obsługują złożone klucze podstawowe? Jeśli nie, czy istnieje jakieś obejście bez zmiany struktury tabeli?

P.S. Używam postgresql.

Odpowiedz

29

Spróbuj podobny poniżej kodu:

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

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

lub jeśli chcesz tylko unikalne mieszane pola:

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

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

EDIT: Chciałbym zwrócić uwagę, że istnieje problem z tym podejściem, jeżeli istnieją 3 kolumny. Aktualizacje kwerend nie działają, ponieważ próbuje zaktualizować (umieszcza pola pk zaraz po "SET"), które są unikalne razem i oczywiście zawiedzie.

+0

Dlaczego to działa? – khajvah

+0

w klasie Meta każda krotka w atrybucie 'unique_together' określająca, że ​​wartości mieszane tych pól według określonej kolejności nie mogą być duplikowane. – Mohsen

+0

Mam na myśli, że po utworzeniu 'key2 = models.IntegerField (unique = True)', nie powinno to oznaczać, że 'key2' musi być unikatowe dla wszystkich wartości nie tylko dla pojedynczego' key1'? – khajvah

Powiązane problemy