2010-06-22 12 views
6

Mam starszą bazę danych z tabelą przechowującą relację wiele do wielu, ale bez jednej kolumny klucza głównego. Czy jest jakiś sposób, aby przekonać Django, by i tak go użył?Django: Wiele do wielu za pośrednictwem tabeli z kluczem złożonym (tylko)

Schematycznie:

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

tabela Labeling wykorzystuje (product_id,label_id) jako związek klucz podstawowy, a ja nie widzę żadnego sposobu, aby poinformować o tym Django. (Po prostu użycie through daje mi Unknown column 'labeling.id' in 'field list'.)

Czy muszę przywrócić niestandardowy kod SQL? Czy może czegoś brakuje?

Odpowiedz

1

Jeśli dodasz unique_together do modelu za wiele-do-wielu tabeli Django użyje tych kolumn zamiast spodziewa się podstawowym klucz o nazwie id.

+0

Niezupełnie, utworzy również pole "id". Istnieje [obejście] (https://stackoverflow.com/a/28712960/52499). Ale tak naprawdę w moim przypadku zdecydowałem się na dodatkowe pole 'id'. Brak starszych tabel. –

1
+0

Nie spodziewałem się, że to ... ale tak się stało: 'unique_together' to wszystko, czego potrzeba, aby Django nie poprosił o kolumnę klucza podstawowego. Jeśli dodasz to (lub słowa do tego efektu) do swojej odpowiedzi, mogę je zaakceptować. (Afaik 'db_index' jest nieistotny: dotyczy tylko poszczególnych pól.) – Tikitu

+0

Chociaż prawdą jest, że Django nie narzeka więcej, jeśli dodasz unique_together *, ale * nadal nie jest w pełni funkcjonalny. Na przykład delete (Model.Delete()) na modelu określonym w parametrach przelotowych będzie wyjątkiem. Jestem ekspertem na tyle, by odważyć się dać to jako odpowiedź, ponieważ to, co przeczytałem, Django nie obsługuje braku klucza podstawowego w Modelu. – Boaz

+0

@Tikitu Dziękuję, dziękuję, dziękuję! Wydzierałem sobie włosy, próbując wymyślić sposób, aby Django nie wymagał kolumny 'primary_key = True' dla mojej starszej bazy danych tylko do odczytu z kilkoma tabelami pośrednimi wiele do wielu. Wiedziałem o 'unique_together', ale nie zdawałem sobie sprawy, że to spowoduje, że nacisk Django na" primary_key = True "zniknie. Teraz, kiedy Django 1.8 faktycznie wydaje ostrzeżenia o ustawieniu 'primary_key = True' na polu ForeignKey, nagle stało się to bardzo ważne. – CoreDumpError

Powiązane problemy