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