django-модерация с помощью менеджеров пользовательских моделей

#django #django-models #django-mptt #django-moderation

Вопрос:

Я использую Django 3.2 и django-модерацию.

Я хочу умерить Фу:

 class MyCustomManager1(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_published=True)


class MyCustomManager2(MyCustomManager1):
    def get_queryset(self):
        return super().get_queryset().filter(/* some criteria */)


class Foo(models.Model):
    # some fields
    objects = models.Manager()

    published = MyCustomManager1()
    live = MyCustomManager2()


moderation.register(Foo)
 

Когда я бегу python manage.py makemigrations , я получаю сообщение об ошибке:

AttributeError: объект типа » Foo » не имеет атрибута «unmoderated_published»

Я попытался обойти это, добавив поля и создав менеджеры для модерируемых объектов, но, хотя это избавило от ошибок, объект больше не модерировался.

Единственный способ, которым я мог модерировать созданные объекты, состоял в том, чтобы удалить всех менеджеров моделей — за исключением objects менеджера по умолчанию.

Как заставить django-модерацию работать с моделями с помощью пользовательских менеджеров моделей?

Я получаю ту же ошибку, когда пытаюсь получить Foo из MPTT — ДАЖЕ без использования пользовательских менеджеров моделей.

Ошибка атрибута: объект типа » Foo » не имеет атрибута «немодерируемый__дерево_менеджер»

Ответ №1:

django-moderation не очень хорошо работает с неявным менеджером по умолчанию.

Укажите default_manager_name явно:

 class Foo(models.Model):
    # some fields
    objects = models.Manager()

    published = MyCustomManager1()
    live = MyCustomManager2()

    class Meta:                           # Add this
        default_manager_name = 'objects'  # Add this
 

Я получаю ту же ошибку, когда пытаюсь получить Foo из MPTT — ДАЖЕ без использования пользовательских менеджеров моделей.

MPTT добавляет пользовательский менеджер моделей _tree_manager .