2013-06-28 16 views
5

Mam dwóch klas w moim pliku models.py:Jak usunąć nadmiarowe pole ID w automatycznie generowanym tabeli ManyToMany w Django?

class Person: 
    person_name = models.CharField(max_length = 50) 

class Course: 
    course_name = models.CharField(max_length = 50) 
    course_person = models.ManyToManyField(Person) 

w moim zmodyfikowanym przykład, jedna osoba wykonuje wiele kursów i jeden kurs jest podejmowana przez wielu ludzi, stąd ManyToMany.

Kiedy pozwolę Django automatycznie generować mój stół, otrzymuję dodatkowe pole ID. Chcę, aby tabela generowana automatycznie generowana przez person_course składała się tylko z dwóch kluczy złożonych: person_id i course_id. Uwaga: Oba są automatycznie generowane, automatycznie zwiększane pola.

Próbowałem również zdefiniować moją klasę ManyToMany i próbowałem połączyć pola za pomocą słowa kluczowego through=, ale to nie pomogło.

Poprosiłem Google, ale bez dużej pomocy. Wiele niektórzy wśród was geniusze mogą zapewnić pewną podpowiedź :)

Odpowiedz

6

Django obecnie does not support composite primary key by default

Co można zrobić, to zamiast trzymać auto generowane id jako surogat() klucz podstawowy, a następnie zdefiniować unique_together relacji w tabeli through .

class Meta: 
    unique_together = (course, person) 

ten sposób można zagwarantować unikatowe wpisy w przelotowym tabeli, a jeśli odwołać id jest odpowiednikiem o przedstawieniu unikalną (course, person) czyli co chcemy tak czy inaczej.

Jest kilka third party apps, które implementują tę funkcję, jeśli chcesz. Jednak, o ile nie jest to bezwzględna konieczność (jak starsza obsługa systemu), po prostu utrzymam to w prostocie i wdrożę unique_together.

+2

Dziękujemy za dane wejściowe. Cóż, ograniczeniem Django jest nie móc tego zrobić. Django stara się ułatwić życie. Kiedyś projektowałem bazy danych od zera do użytku w moich aplikacjach i nie jestem tak szczęśliwy, że Django próbuje zrobić wszystko sam. Przynajmniej nie mam tak dużo kontroli nad rzeczami, np. Nie tworząc pola redundantnego ID. Używam środowiska roboczego MySQL do wizualnego przedstawiania moich baz danych, a to dodatkowe pole identyfikatora nie wygląda dobrze. W każdym razie, ponieważ nie ma to wpływu na logikę aplikacji, mogę z tym żyć :) – shailenTJ

Powiązane problemy