Naprawdę trudno mi zrozumieć koncepcję typów treści Django. Wydaje się to bardzo hakerskie i ostatecznie przeciwne temu, jak Python ma tendencję do robienia rzeczy. Biorąc to pod uwagę, jeśli mam używać Django, muszę pracować w ramach tego frameworka.
Przychodzę więc tutaj i zastanawiam się, czy ktoś może podać praktyczny przykład ze świata rzeczywistego, jak działa typ treści i jak można go zaimplementować. Prawie wszystkie samouczki (głównie na blogach), które recenzowałem, nie radzą sobie tak naprawdę z koncepcją. Wydaje się, że wychodzą z miejsca, w którym dokumentacja Django została przerwana (co wydaje się nigdzie).
Odpowiedzi:
Chcesz więc używać frameworka Content Types w swojej pracy?
Zacznij od zadania sobie pytania: „Czy któryś z tych modeli musi być powiązany w ten sam sposób z innymi modelami i / lub czy później będę ponownie wykorzystywać te relacje w nieprzewidziany sposób?” Powodem, dla którego zadajemy to pytanie, jest to, że to właśnie najlepiej radzi sobie framework Content Types: tworzy ogólne relacje między modelami. Bla bla, zagłębmy się w jakiś kod i zobaczmy, co mam na myśli.
Okej, więc mamy teoretyczny sposób na stworzenie tej relacji. Jednak jako programista Pythona, twój wyższy intelekt mówi ci, że to jest do bani i możesz zrobić lepiej. Piątka!
Wejdź do frameworka typów treści!
Cóż, teraz przyjrzymy się bliżej naszym modelom i przerobimy je, aby były bardziej „wielokrotnego użytku” i bardziej intuicyjne. Zacznijmy od pozbycia się dwóch kluczy obcych w naszym
Comment
modelu i zastąp jeGenericForeignKey
.Więc co się stało? Cóż, weszliśmy do środka i dodaliśmy niezbędny kod, aby umożliwić ogólną relację z innymi modelami. Zwróć uwagę, że istnieje więcej niż tylko a
GenericForeignKey
, ale także aForeignKey
doContentType
i aPositiveIntegerField
dlaobject_id
. Te pola służą do informowania Django, z jakim typem obiektu jest to związane i jaki jest identyfikator tego obiektu. W rzeczywistości ma to sens, ponieważ Django będzie potrzebować obu, aby wyszukać te powiązane obiekty.Cóż, to nie jest zbyt podobne do Pythona ... jest trochę brzydkie!
Prawdopodobnie szukasz szczelnego, nieskazitelnego, intuicyjnego kodu, z którego Guido van Rossum byłby dumny. Rozumiem cię. Spójrzmy na
GenericRelation
pole, żebyśmy mogli założyć na to ładny łuk.Bam! W ten sposób możesz pracować z komentarzami dla tych dwóch modeli. W rzeczywistości, zróbmy to w naszej powłoce (wpisz
python manage.py shell
z katalogu projektu Django).To takie proste.
Jakie są inne praktyczne implikacje tych „ogólnych” relacji?
Ogólne klucze obce pozwalają na mniej inwazyjne relacje między różnymi aplikacjami. Na przykład, powiedzmy, że wyciągnęliśmy model Comment do jego własnej aplikacji o nazwie
chatterly
. Teraz chcemy stworzyć kolejną aplikację o nazwie, wnoise_nimbus
której ludzie przechowują swoją muzykę i dzielą się nią z innymi.A co, jeśli chcemy dodać komentarze do tych piosenek? Cóż, możemy po prostu narysować ogólną relację:
Mam nadzieję, że uznacie to za pomocne, ponieważ chciałbym natknąć się na coś, co pokazałoby mi bardziej realistyczne zastosowanie pól
GenericForeignKey
iGenericRelation
.Czy to zbyt piękne, aby mogło być prawdziwe?
Jak wszystko w życiu, są plusy i minusy. Za każdym razem, gdy dodajesz więcej kodu i więcej abstrakcji, podstawowe procesy stają się cięższe i nieco wolniejsze. Dodanie relacji ogólnych może nieco osłabić wydajność, mimo że będzie próbował inteligentnie buforować wyniki. Podsumowując, wszystko sprowadza się do tego, czy czystość i prostota przeważają nad niewielkimi kosztami wydajności. Dla mnie odpowiedź jest milion razy tak.
Struktura typów treści to więcej, niż pokazałem tutaj. Istnieje cały poziom szczegółowości i bardziej szczegółowego użycia, ale dla przeciętnej osoby w ten sposób będziesz go używać 9 na 10 razy, moim zdaniem.
Ogólne relacje (?) Uwaga!
Dość dużym zastrzeżeniem jest to, że jeśli używasz a
GenericRelation
, jeśli model, w którymGenericRelation
zastosowano metodę (Picture
), zostanie usunięty, wszystkie powiązane (Comment
) obiekty również zostaną usunięte. A przynajmniej w chwili pisania tego tekstu.źródło
GenericRelation
w,Post
aPicture
potem nie muszęobject_id
,content_type
icontent_object
wComment
?Dobra, bezpośrednia odpowiedź na twoje pytanie: (z kodu źródłowego django) brzmi: Analiza typów multimediów zgodnie z RFC 2616, sekcja 3.7.
To jest łzawym sposobem na powiedzenie, że czyta / umożliwia-ci-modyfikację / przechodzi wzdłuż nagłówka httpd „Content-type” .
Jednak prosisz o bardziej praktyczny przykład użycia. Mam dla Ciebie 2 sugestie:
1: sprawdź ten kod
2: pamiętaj, że django to Python i jako takie dzierży potęgę społeczności Pythona. Istnieją 2 niesamowite wtyczki RESTFul do django. Jeśli więc chcesz zobaczyć, jak głęboki jest cały królik, możesz to sprawdzić.
Proponuję zapoznać się z samouczkiem django-rest-framework, który w szczególności zajmie się „działaniem na różnych treściach / typach”. Uwaga: powszechną praktyką jest używanie nagłówka typu zawartości do „wersji” spokojnych interfejsów API .
źródło