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))