django-mptt的MPTTModel继承问题

时间:2018-11-27 11:06:58

标签: python inheritance django-orm django-mptt

通过模型继承满足了意外行为。

我在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的祖先?

1 个答案:

答案 0 :(得分:0)

为自己找到了解决方案:我们应该使用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'>