Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2016, 10:37   #1
Dudki
 
Регистрация: 24.01.2015
Сообщений: 7
По умолчанию Вопрос по примеру из учебника.

Приветствую!
Параллельно изучаю Django и Python и появился вопрос по странному, на мой взгляд, примеру из книги.
Итак, у нас есть класс, производный от Manager:
Код:
class PublishedManager(models.Manager):
  def get_queryset(self):
    return super(PublishedManager, 
    self).get_queryset()\
    .filter(status='published')
Как я понимаю, тут get_queryset - всего лишь переопределенный метод нового класса, он не вызывается автоматически при создании экземпляра.
Далее мы добавляем объект нового класса атрибутом в другой класс:
Код:
class Post(models.Model):
# ...
objects = models.Manager() # The default manager.
published = PublishedManager() # Our custom manager.
После чего автор учебника, всех ему благ, сообщает нам, что получить все экземпляры класса Post, где status='published', мы можем через метод filter() родительского класса Manager, например, вот так:
Код:
Post.published.filter(title__startswith='Who')
А я вот сижу и думаю, для этой строки кода filter() вызывается на экземляре PublishedManager, у которого, конечно, есть метод get_queryset, который фильтрует по status='published', но я не вижу, чтобы он где-то вызывался, при создании объекта или после. А автор пишет, что второй фильтр по title__startswith='Who' уже идет по отфильтрованному по status='published' списку.
Что мною упущено?
Dudki вне форума Ответить с цитированием
Старый 14.07.2016, 13:38   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Сам я на Django не пишу. Н ока кпонял из документации, то этот метод/фильтр
вызывается когда идет запрос по
Post.published.all();

Потом можно измнить фильтр и вызвать
Post.published.filter(title='Matild a');

Post.published.all();
Post.published.count();

https://docs.djangoproject.com/en/1....s/db/managers/
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 14.07.2016, 14:38   #3
Dudki
 
Регистрация: 24.01.2015
Сообщений: 7
По умолчанию

Цитата:
Сам я на Django не пишу. Н ока кпонял из документации, то этот метод/фильтр
вызывается когда идет запрос по
Post.published.all();
Спасибо за отклик. Да, в документации есть такой намек, но в листинге нет методал all().
Я пока видимо документацией толком пользоваться не умею, помогите, пожалуйста, синтаксически расшифровать такую запись:
Код:
[docs]class Manager(BaseManager.from_queryset(QuerySet)):
    pass
класс Manager происходит от класса BaseManager.....а вот .from_queryset(QuerySet) что означает? Хочется заподозрить, что all() или get_queryset() вызываются при вызове наследуемого консруктора (но разве наследуемый конструктор базового класса не должен вызывать свою же функцию get_queryset() ?), но чот кода класса пока не вижу.
Dudki вне форума Ответить с цитированием
Старый 14.07.2016, 17:41   #4
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Возможно, и скорее даже всего происходит так.

Вызывается метод наследуемого класса, и если у него есть
get_queryset() то используюется он. А родительскому классу просто сообщается что запрос обработан успешно, и ему ничего не нужно делать.

Но я могу ошибаться.

А на счет "get_queryset()" сказано что это объект "QuerySet".

Если проводить аналогию с QSL то грубо-говоря его можно назвать курсором и строителем запроса. Селектором грубо говоря.

Цитата:
Of course, because get_queryset() returns a QuerySet object, you can use filter(), exclude() and all the other QuerySet methods on it. So these statements are all legal:

Там есть интереснфй пример:

PHP код:
class AuthorManager(models.Manager):
    
def get_queryset(self):
        return 
super(AuthorManagerself).get_queryset().filter(role='A')

class 
EditorManager(models.Manager):
    
def get_queryset(self):
        return 
super(EditorManagerself).get_queryset().filter(role='E')

class 
Person(models.Model):
    
first_name models.CharField(max_length=50)
    
last_name models.CharField(max_length=50)
    
role models.CharField(max_length=1choices=(('A'_('Author')), ('E'_('Editor'))))
    
people models.Manager()
    
authors AuthorManager()
    
editors EditorManager() 
Цитата:
This example allows you to request Person.authors.all(), Person.editors.all(), and Person.people.all(), yielding predictable results.
Вообще он очень мощный, и за один вечер в нем явно не разобраться.

У меня у самого руки никак не дойдут
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа из учебника Freeman-des Помощь студентам 4 22.11.2010 19:56
Вопрос из учебника С. Прата sunplant Общие вопросы C/C++ 3 07.04.2010 11:10
вопрос из учебника pilot76 Помощь студентам 1 12.09.2009 16:51
Пример из учебника valerij Microsoft Office Excel 11 20.06.2008 15:43