2012-04-14 19 views
6

Piszę moje pierwsze kilka modeli Django i chciałem rzucić okiem na klasę podstawową, którą rozszerzają wszystkie modele (przykład: "Ankieta klasy (model.Model"), ale nie mogłem znaleźć klasy bazowej Modelu.Sprawdziłem source on github i kiedy przeglądałem katalog django.db.models byłem zaskoczony, że nie znalazłem pliku "Model.py", na który mogłem spojrzeć, czy ten plik jest generowany? Czy model klasy żyje gdzieś indziej? Czy jest tam jakaś magia pakietów Pythona? że nie jestem zaznajomiony z?Gdzie jest Model.py w kodzie źródłowym Django?

Odpowiedz

5

Jak już zauważono, Python nie jest Javą. W Pythonie nic nie mówi, że klasa musi żyć w pliku o tej samej nazwie co klasa.

Jak San4ez zaznacza, klasa mieszka w django.db.models.baseModel, i jest importowany do pliku __init__.py w tym katalogu, tak, że może być odniesione bezpośrednio jako models.Model. To nie jest żadna magia, tylko normalny, idiomatyczny Python.

Jednak gdy spojrzysz na kod samej klasy, okaże się, że składa się ona ze sporej ilości magii w Pythonie, w szczególności wokół metaclasses. Ale to inne pytanie.

+0

Znalazłem go z twoją pomocą (nie, dzięki wyszukiwarce Github). Prowadzi mnie to do dość filozoficznych pytań na temat konwencji/stylu/reguł Pythona, jednak jest to pytanie do innego posta (i po przeprowadzeniu niewielkich badań). Dzięki! –

2

W https://github.com/django/django/blob/master/django/db/models/__init__.py

wygląd

from django.db.models.base import Model 

Więc Model klasa jest tam opisane https://github.com/django/django/blob/master/django/db/models/base.py

Dosłownie można importować Model ten sposób from django.db.models.base import Model do projektu. Ale twórcy django postanowili ukryć niektóre klasy usług, zaimportować niektóre do pakietu django.db.models i zaoferować krótszy import.

Powiązane problemy