Django.fun

Django overriding default managers of contrib models

I have a Django app named site_settings in which SiteSettings model is defined. This model contains a foreign key to django.contrib.sites.models.Site model. Now I want to override default objects manager of Site model with new one I defined:

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


class SiteManager(_OrigSiteManager):
    ...

I tried:

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

But it didn't work. The problem is I am adding to class with already existing objects name. When adding with another name, it works as expected:

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

But I want to override existing objects manager with my custom manager. How can I do that?

You can redefine and use your own Site class everywhere:

from django.contrib.sites.models import Site

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

or you can use contribute_to_class:

from django.contrib.sites.models import Site

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

or you can made monkey patch:

from django.contrib.sites.models import Site

Site.objects = SiteManager(model=Site)

If you need it only to change queryset in foreignkey to Site, you can use limit_choices_to:

foreignkey(Site, limit_choices_to=Q(your query to limit sites queryset))

Tutorials

Константы Python: Улучшение управляемости вашего кода

Современный Python: начинаем проект с pyenv и poetry

Настройка проекта Python — виртуальные среды и управление пакетами

Использование requests в Python — тайм-ауты, повторы, хуки

Понимание декораторов в Python

ProcessPoolExecutor в Python: полное руководство

map() против submit() с ProcessPoolExecutor в Python

Понимание атрибутов, словарей и слотов в Python

Полное руководство по slice в Python

Выпуск Django 4.0

Безопасное развертывание приложения Django с помощью Gunicorn, Nginx и HTTPS

Автоматический повтор невыполненных задач Celery

Django REST Framework и Elasticsearch

Докеризация Django с помощью Postgres, Gunicorn и Nginx

Асинхронные задачи с Django и Celery

Релизы безопасности Django: 3.2.4, 3.1.12 и 2.2.24

Выпуски исправлений ошибок Django: 3.2.3, 3.1.11 и 2.2.23

Эффективное использование сериализаторов Django REST Framework

Выпуски безопасности Django: 3.2.2, 3.1.10 и 2.2.22

Выпущенные релизы безопасности Django: 3.2.1, 3.1.9 и 2.2.21

View all tutorials →