Django переопределяет менеджеры по умолчанию для моделей contrib

У меня есть приложение Django с именем site_settings, в котором определена модель SiteSettings. Эта модель содержит внешний ключ к модели django.contrib.sites.models.Site. Теперь я хочу переопределить менеджер по умолчанию objects модели Site новым, который я определил:

from django.contrib.sites.models import SiteManager as _OrigSiteManager


class SiteManager(_OrigSiteManager):
    ...

Я пытался:

Site.add_to_class("objects", SiteManager())

Но это не сработало. Проблема в том, что я добавляю в класс с уже существующим именем objects. При добавлении с другим именем все работает как ожидалось:

Site.add_to_class("my_objects", SiteManager())  # now Site.my_objects points to my custom manager

Но я хочу переопределить существующий менеджер objects своим пользовательским менеджером. Как я могу это сделать?

Вы можете переопределить и использовать свой собственный класс Site везде:

from django.contrib.sites.models import Site

    class Site(Site):
        ...
        objects = SiteManager()

или вы можете использовать contribute_to_class:

from django.contrib.sites.models import Site

SiteManager().contribute_to_class(Site, 'objects')

или вы можете сделать обезьяний патч:

from django.contrib.sites.models import Site

Site.objects = SiteManager(model=Site)

Если вам нужно только изменить queryset в foreignkey на Site, вы можете использовать limit_choices_to:

foreignkey(Site, limit_choices_to=Q(your query to limit sites queryset))
Вернуться на верх