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'>
遇到模型继承的意外行为。
我在 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'>