Django - использование метода менеджера моделей в фильтре Admin - PullRequest
0 голосов
/ 04 мая 2018

Я использую Django 2.0

У меня есть класс моделей с пользовательским менеджером в models.py

class MockTestQuerySet(models.query.QuerySet):
    def upcoming(self):
        return self.filter(start_date__gte=datetime.now())

    def past(self):
        return self.filter(end_date__lte=datetime.now())


class MockTestManager(models.Manager):
    def get_queryset(self):
        return MockTestQuerySet(self.model, self._db)

    def upcoming_tests(self):
        return self.get_queryset().upcoming()

    def past_tests(self):
        return self.get_queryset().past()

    def is_past(self, mock_pk):
        mock_test = self.get_queryset().past().filter(pk=mock_pk).first()
        if mock_test is not None:
            return True

        return False

    def is_future(self, mock_pk):
        mock_test = self.get_queryset().upcoming().filter(pk=mock_pk).first()
        if mock_test is not None:
            return True

        return False


class MockTest(models.Model):
    title = models.CharField(max_length=250, null=False, blank=False)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    modified = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    objects = MockTestManager()

    class Meta:
        db_table = 'mock_tests'
        ordering = ['start_date']

Теперь я работаю над модулем администратора и хочу создать фильтр, который фильтрует предстоящие или прошедшие тесты, вызывая past_tests() или upcoming_tests()

До сих пор я пробовал это в admin.py

class InPast(admin.SimpleListFilter):
    def lookups(self, request, model_admin):
        pass

    title = _('Past Mock Tests')
    parameter_name = 'past'

    def queryset(self, request, queryset):
        return queryset.past_tests()


@admin.register(MockTest)
class MockTestAdmin(admin.ModelAdmin):
    list_display = ['title', 'start_date', 'end_date', 'duration']

    list_filter = [
        InPast
    ]

Я знаю, я делаю это неправильно, но не могу понять, как это сделать.

...