Как получить доступ к атрибутам модели в пользовательском менеджере? - PullRequest
1 голос
/ 01 ноября 2011

У меня есть модель Django для объекта с DateField. У меня также есть два менеджера, которые фильтруют эти объекты для определенного диапазона дат.

class SchoolYearManager(models.Manager):
    def get_query_set(self):
        now = datetime.datetime.now()
        current_year = now.year
        start_date = datetime.date(current_year, 7, 1)
        end_date = datetime.date((current_year + 1), 6, 30)
        return super(SchoolYearManager, self).get_query_set().filter(status=self.model.LIVE).filter(event_date__range=(start_date, end_date))

class PastSchoolYearManager(models.Manager):
    def get_query_set(self):
        current_year = self.model.event_date.year
        start_date = datetime.date(current_year, 7, 1)
        end_date = datetime.date((current_year + 1), 6, 30)
        return super(PastSchoolYearManager, self).get_query_set().filter(status=self.model.LIVE).filter(event_date__range=(start_date, end_date))

class Event(models.Model):
    LIVE = 3
    DRAFT = 4
    STATUS_CHOICES = (
        (LIVE, 'Live'),
        (DRAFT, 'Draft'),
    )
    status = models.IntegerField(choices=STATUS_CHOICES, default=4, help_text="Only entries with a status of 'live' will be displayed publically.")
    event_date = models.DateField()

    objects = Models.Manager()
    school_year_events = SchoolYearManager()
    past_school_year_events = PastSchoolYearManager()

Мой первый менеджер (SchoolYearManager) работает, как ожидается, и возвращает события в этом диапазоне дат. Но когда я пытаюсь сделать Event.past_school_year_events.all(), я получаю ошибку атрибута: «тип объекта« Event »не имеет атрибута« event_date »».

Моя цель со вторым менеджером (PastSchoolYearEvents) состоит в том, чтобы обернуть общий вид архива года, чтобы возвращать события в диапазоне дат для определенного года.

Почему я не могу позвонить self.model.event_date через менеджера?

Правильно ли я поступаю? Если нет, то как лучше это сделать?

1 Ответ

1 голос
/ 01 ноября 2011

Как это могло работать? К какой дате события это может относиться? Когда вы звоните Event.past_school_year_events.all(), у вас нет экземпляра модели. self.model, как следует из названия, относится к классу модели. Так как он мог узнать, какую дату вы имеете в виду?

На самом деле я не могу понять, что вы пытаетесь сделать - откуда вы собираетесь получить дату. Вы хотите начать с события, а затем получить все другие события в том же году, что и этот? В этом случае, я подозреваю, вы просто хотите превратить past_school_year_events в метод модели, а не в менеджера.

Редактировать Если вы хотите начать с определенного года, менеджер, безусловно, подходит, но вам нужно будет указать год в методе менеджера в качестве параметра. Для этого я бы использовал отдельный метод в менеджере, а не переопределял get_query_set - на самом деле, добавьте еще один метод в SchoolYearManager:

class SchoolYearManager(models.Manager):
    def live_events(self, start_date, end_date):
       return self.filter(status=self.model.LIVE).filter(event_date__range=(start_date, end_date))

    def this_year(self):
        now = datetime.datetime.now()
        current_year = now.year
        start_date = datetime.date(current_year, 7, 1)
        end_date = datetime.date((current_year + 1), 6, 30)
        return self.live_events(start_date, end_date)

    def from_year(self, year):
        start_date = datetime.date(year, 7, 1)
        end_date = datetime.date(year+1, 6, 30)
        return self.live_events(start_date, end_date)

Теперь у вас есть только один менеджер, который не переопределяет get_query_set, поэтому вам даже не нужно сохранять по умолчанию - вы можете оставить его как objects. Так что вы можете сделать:

Event.objects.this_year()  # all this year's events
Event.objects.from_year(2010) # all events from 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...