django-mptt 的 MPTTModel 继承问题

django-mptt's MPTTModel inheritance issue

遇到模型继承的意外行为。

我在 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()))

得到这个:mptt.querysets.TreeQuerySet。 但是等了 MyTreeQuerySet.

使用 Django==1.11 和 django-mptt==0.9.1 检查

如何使用自定义查询集创建 MPTTModel 的祖先?

为自己找到了解决方案:我们应该使用 mptt.managers.TreeManager.from_queryset 而不是 dj_models.Manager.from_queryset。 我想是因为 MPTTModel.__new__ 的经理列表修补有一些魔力。我没有深究。

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