首页 > 解决方案 > django-mptt 的 MPTTModel 继承问题

问题描述

使用模型继承遇到意外行为。

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

标签: pythoninheritancedjango-ormdjango-mptt

解决方案


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

推荐阅读