Осветление Django BaseManager и DefaultManager
Я использую Django 3.2. Я читаю раздел о пользовательских менеджерах, и наткнулся на этот текст в документации:
По умолчанию Django использует экземпляр менеджера Model._base_manager при обращении к связанным объектам (т.е. choice.question), а не класс _default_manager на связанном объекте. Это связано с тем, что Django должен иметь возможность получить связанный объект, даже если в противном случае он был бы отфильтрован (и, следовательно, недоступен) менеджером по умолчанию.
Если обычный базовый класс менеджера (django.db.models.Manager) не является подходит для ваших обстоятельств, вы можете указать Django, какой класс следует использовать, установив Meta.base_manager_name.
Базовые менеджеры не используются при запросах к связанным моделям, или когда доступа к отношениям "один ко многим" или "многие ко многим". Например, если модель Question из учебника имела поле deleted и базовый менеджер, который отфильтровывает экземпляры с deleted=True, то набор запросов типа Choice.objects.filter(question__name__startswith='What') будет включать в себя варианты, связанные с удаленными вопросами.
Текст раздела кажется немного запутанным. Можно ли объяснить то, о чем говорится в приведенном выше тексте, с помощью моделей, приведенных ниже?
class Foo(models.Model):
name = models.CharField(max_length=64)
deleted = models.Boolean(default=False)
# ...
class FooBar(models.Model):
foo = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='foos')
start_date = models.DateTimeField(default=now, db_index=True)
end_date = models.DatetTimeField(default=now+timeddelta(days=200), db_index=True)
# ...