Как добавить пользовательский менеджер в модель стороннего приложения - PullRequest
0 голосов
/ 09 февраля 2020

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

class SoftDeleteManager(models.Manager):
    def get_queryset(self):
        return super(SoftDeleteManager, self).get_queryset().filter(is_active=True)


class Student(models.Model):
    is_active = models.BooleanField(default=True)
    active_objects = SoftDeleteManager()
    objects = models.Manager()

Далее, я хочу добавить тот же active_objects менеджер на модели auth.User, но так как эта модель не определена в моей кодовой базе, я не уверен, что делать дальше.

1 Ответ

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

Предположение: вы хотите мягко удалить любую стороннюю модель, которая не имеет поля is_active. И это не должна быть модель auth.User, потому что это особый случай.

Сначала я бы создал класс абстрактной модели для реализации поведения мягкого удаления:

class SoftDeleteModel(models.Model):
    is_active = models.BooleanField(default=True)

    active_objects = SoftDeleteManager()
    objects = models.Manager()

    class Meta:
        abstract = True

Теперь Предположим, у вас есть стороннее приложение с моделью Message, затем внутри вашего приложения вы можете создать его подкласс:

from 3rdparty.models import Message as ExtMessage
from .models import SoftDeleteModel

class Message(SoftDeleteModel, ExtMessage):
    pass

Теперь ваш собственный класс Message имеет дополнительное поле и менеджер active_objects , Вам нужно будет makemigrations и migrate, потому что будет создана новая таблица для Message.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...