0

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?

1 Answers1

0

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