Custom Django Model Manager выдает ошибку при попытке ее использования - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь написать простой менеджер моделей, который будет фильтровать по определенному полю.

У меня есть модель, которая выглядит следующим образом:

    """Model definition for Period."""
    year = models.ForeignKey(Year, on_delete=models.PROTECT)
    name = models.CharField(max_length=50)
    active = models.BooleanField(default=False)

    objects = models.Manager()
    active_year_periods = PeriodManager().active_year_periods()

Мой менеджер периодов выглядит так это:

class PeriodManager(models.Manager):
    """
    The manager for Period objects
    """

    def active_year_periods(self):
        """
        Gets the Period objects for the active year

        Returns:
            Period<Queryset> -- Periods for an active year
        """
        return super().get_queryset().filter(year__active=True)

Я написал что-то простое, чтобы протестировать этот конкретный менеджер, но столкнулся с ошибкой, которую я не уверен, что это значит:

  File "/dir/path/myapp/models.py", line 44, in <module>
    class Period(models.Model):
  File "/dir/path/myapp/models.py", line 55, in Period
    active_year_periods = PeriodManager().active_year_periods()
  File "/dir/path/myapp/managers.py", line 19, in active_year_periods
    return self.get_queryset().filter(year__active=True)
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/query.py", line 892, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/query.py", line 910, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1290, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1318, in _add_q
    split_subq=split_subq, simple_col=simple_col,
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1190, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1049, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "/dir/path/venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 297, in get_meta
    return self.model._meta
AttributeError: 'NoneType' object has no attribute '_meta'

Эта ошибка стартовал еще до того, как мой тест запустится - мой тест в настоящее время не работает, но из-за этой ошибки он не пройдет.

Вот мой тест:

class TestPeriodManager(TestCase):
    """
    Test cases for the Period Manager
    """
    def setUp(self):
        pass    

    def test_active_year_periods_returns_correct_amount(self):
        """
        Test that the PeriodManager active_year_periods method returns
        appropriate amount of Periods
        """
        # periods_in_active_year = swm.Period.active_year_periods
        # print(periods_in_active_year)
        self.assertTrue(False)

Любой идеи, почему я могу столкнуться с этой проблемой? Я все делаю неправильно?

Я пытаюсь использовать пользовательские методы менеджера, чтобы в конечном итоге я мог передать аргументы для дополнительной фильтрации, где это необходимо.

1 Ответ

1 голос
/ 09 января 2020

Вам необходимо присвоить active_year_periods (ваш пользовательский менеджер) классу менеджера, а не методу:

models.py :

objects = models.Manager()
active_year_periods = PeriodManager()
...