Search code examples
pythoninheritancedjango-ormdjango-mptt

django-mptt's MPTTModel inheritance issue


Met unexpected behaviour with model inheritance.

I launch this code in django shell:

import mptt
from django.db import models


class MyTreeQuerySet(mptt.querysets.TreeQuerySet):
    pass

class MyTreeManager(
    models.Manager.from_queryset(MyTreeQuerySet)
):
    pass

class TreeModel(mptt.models.MPTTModel):
    class Meta:
        app_label = 'myapp'
    objects = MyTreeManager()

print(type(TreeModel.objects.all()))

And got this: mptt.querysets.TreeQuerySet. But waited MyTreeQuerySet.

Checked with Django==1.11 and django-mptt==0.9.1

How can i create MPTTModel's ancestor with custom query set?


Solution

  • found solution for myself: we should use mptt.managers.TreeManager.from_queryset instead of dj_models.Manager.from_queryset. I suppose it because MPTTModel.__new__ has some magic with it's managers list patching. I didn't dig in.

    import mptt
    from django.db import models
    
    
    class MyTreeQuerySet(mptt.querysets.TreeQuerySet):
        pass
    
    class MyTreeManager(
        mptt.managers.TreeManager.from_queryset(MyTreeQuerySet)
    ):
        pass
    
    class TreeModel(mptt.models.MPTTModel):
        class Meta:
            app_label = 'myapp'
        objects = MyTreeManager()
    
    print(type(TreeModel.objects.all()))
    
    # output:
    # <class '__main__.MyTreeQuerySet'>