Pytanie Jak zdefiniować polimorficzną relację między modelami w Django?


Pracuję nad aplikacją Django, która zawiera Offer Model. Na Offer instancja zawiera warunki cenowe i wskazuje na definicję produktu. Model produktu jest w rzeczywistości hierarchią (mam Television model, a Camcorder model itp.). Więc chciałbym Offer model, który zawiera polimorficzne (lub "ogólne") skojarzenie wskazujące dowolny produkt.

Na razie wszystko, co znalazłem, to użycie ogólne stowarzyszenia w ContentTypes podanie. To może zrobić, ale szukam alternatyw, jeśli w ogóle.

Dzięki za pomoc.

(jedno rozwiązanie na odpowiedź proszę)


12
2018-01-06 10:12


pochodzenie




Odpowiedzi:


ContentTypes to właściwe podejście. Dzieje się tak, ponieważ narzędzie ForignKey może wskazywać tylko na jeden typ tabeli, więc musisz przejść przez tabelę pośrednią i wykonać podział w zależności od rodzaju.

Więc dziedziczenie modelu dla hierarchii klas, ale ContentType dla kluczy obcych.


4
2018-01-23 23:27





Jeśli chcesz wskazać tylko "dowolny produkt", a nie model, rozwiązaniem będzie posiadanie modelu produktu, z którego wszystkie produkty odziedziczą (tj. Telewizja i kamera są obydwoma podklasami produktu), i nadanie modelowi oferty klucza obcego do Produkt.


3
2018-01-06 18:49



Tak, to jest ogólny pomysł, ale jeśli robię tylko to, to mam dwie wady: po pierwsze, nie mogę używać dziedziczenia z wieloma tabelami, po drugie, gdy przechodzę z oferty do produktu, otrzymuję instancję produktu zamiast Wystąpienie kamery (lub innej klasy betonu). - MiniQuark
Możesz automatycznie przekształcić wystąpienie produktu w instancję (np.) Kamery, jeśli przechowujesz plik FK do "treści podrzędnej" ContentType (kamery) w czasie tworzenia. Więcej dyskusji na groups.google.com/group/django-users/browse_thread/thread/... - Carl Meyer
Co masz na myśli przez "Nie mogę używać dziedziczenia wielu tabel"? Dziedziczenie wielu tabel jest to, w jaki sposób Django implementuje dziedziczenie z nie abstrakcyjnych klas bazowych (w przeciwieństwie do Railsów, które dziedziczą pojedynczo). Twój wybór tutaj to dziedziczenie lub ogólne relacje; nie ma innej srebrnej kuli. - Carl Meyer


Nie możesz tego zrobić w Django. Albo użyj ogólne relacje lub aplikacja Django, która dodaje tę funkcję, jak django_polymorphic.


2
2018-03-03 05:12





Spojrzeć na django-polimorficznyimplementuje tę funkcję i wewnętrznie korzysta z ContentTypes.


1
2018-05-21 14:31





Może chcesz się przyjrzeć dziedziczenie modelu.


-4
2018-01-06 10:15



Oczywiście się z tym zgadzam, ale czy mógłbyś wyjaśnić odpowiedź, aby była naprawdę przydatna dla kogoś, kto o to poprosi. W ten sposób mogę dać +1. - Ivan
Dzięki, ale nie sądzę, że to jest odpowiedź. Potrzebuję czegoś takiego: class Offer (models.Model): product = models.ForeignKey (Product) ... Where Product jest klasą abstrakcyjną, a rzeczywisty obiekt referencyjny jest instancją konkretnej podklasy. Jakieś pomysły? - MiniQuark