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