Skip to content

Default manager is not setup with django-modeltranslations #981

@shosca

Description

@shosca

Bug report

What's wrong

_default_manager is not being setup in plugin when using django-modeltranslations as it replaces the default manager and base manager to be modeltranslation.manager.MultilingualManager which causes

try:
default_manager_info = self.lookup_typeinfo_or_incomplete_defn_error(default_manager_fullname)
except helpers.IncompleteDefnException as exc:
# Check if default manager could be a generated manager
base_manager_fullname = helpers.get_class_fullname(default_manager_cls.__bases__[0])
generated_manager_info = self.get_generated_manager_info(default_manager_fullname, base_manager_fullname)
if generated_manager_info is None:
to fail and never setup a default manager. This also affects the generation of related managers of foreign keys

Instead of giving up assigning a generic manager in AddDefaultManagerAttribute fixes the issue though not sure if this is the right thing to do:

class AddDefaultManagerAttribute(ModelClassInitializer):
    def run_with_model_cls(self, model_cls: Type[Model]) -> None:
        if "_default_manager" in self.model_classdef.info.names:
            return None

        default_manager_cls = model_cls._meta.default_manager.__class__
        default_manager_fullname = helpers.get_class_fullname(default_manager_cls)

        try:
            default_manager_info = self.lookup_typeinfo_or_incomplete_defn_error(default_manager_fullname)
        except helpers.IncompleteDefnException as exc:
            # Check if default manager could be a generated manager
            base_manager_fullname = helpers.get_class_fullname(default_manager_cls.__bases__[0])
            generated_manager_info = self.get_generated_manager_info(default_manager_fullname, base_manager_fullname)
            if generated_manager_info is None:
                # Manager doesn't appear to be generated. Giving up by setting up a generic manager
                default_manager_info = self.lookup_typeinfo_or_incomplete_defn_error("django.db.models.manager.Manager")

        default_manager = Instance(default_manager_info, [Instance(self.model_classdef.info, [])])
        self.add_new_node_to_model_class("_default_manager", default_manager)

How is that should be

_default_manager should be setup

System information

  • OS: docker python:3.10 image
  • python version: 3.10
  • django version: 3.2.13
  • mypy version: 0.950
  • django-stubs version: 1.11.0 and 24a3b22
  • django-stubs-ext version: 0.4.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions