Пока не очень разобрался с метаклассами и прочими премудростями Python и вот возник такой вопрос.
Хочется реализовать что то вроде Manager в Django ORM. Т.е. есть несколько классов, унаследованных от базового. У них есть экземпляры в некотором количестве. Хочется сделать что-то вроде этого:
class Foo(BaseClass): #Определение класса pass #Где-то в другом модуле.. from myapp.models import Foo x = Foo.objects.get_all() # Возвращается итератор for item in x: #Перебираем объекты pass
Т.е. идея та же, что в Django. Создаем объекты, сохраняем их в БД. Когда нужно - получаем итератор по всем нужным объектам через вызов метода базового класса (BaseClass в моем примере).
Мне пришло в голову только использование @classmethod, который будет возвращать итератор или менеджер объектов, который, в свою очередь будет возвращать итератор.
Ковырял исходники django, но своих мозгов разобраться в этом не хватает. Может кто-нибудь объяснит на пальцах, как это работает? Конкретно я не нашел:
1. Как изолируется случай вызова .objects.get_all() из экземпляра.
2. .objects возвращает QuerySet, а его методы тоже возвращают QuerySet.. Когда пользуешься этим - все удобно и логично. Но как это реализовано, я не очень понимаю.
Можно, конечно, до посинения читать исходники, но там очень много всего накручено, мне бы на пальцах..
Большое спасибо всем откликнувшимся.