Проблема наследования MPTTModel в django-mptt - PullRequest
0 голосов
/ 27 ноября 2018

Встретил неожиданное поведение с наследованием модели.

Я запускаю этот код в оболочке django:

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 голосов
/ 04 декабря 2018

нашел решение для себя: мы должны использовать 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'>
...