Django Migrations ValueError: Could not find manager in django.db.models.manager

Django Migrations ValueError: Could not find manager in django.db.models.manager

我正在尝试从 Django 1.7 更新到 Django 1.8

我的一个模型使用 django.contrib.sites.managers 中的 CurrentSiteManager,如下所示:

from django.contrib.sites.managers import CurrentSiteManager

class NewsQuerySet(models.QuerySet):
    #...

class News(models.Model):
    #...

    objects = NewsQuerySet.as_manager()
    on_site = CurrentSiteManager.from_queryset(NewsQuerySet)()

当我尝试 运行 迁移(makemigrations 或 migrate)时,我得到:

ValueError: Could not find manager CurrentSiteManagerFromNewsQuerySet in django.db.models.manager. Please note that you need to inherit from managers you dynamically generated with 'from_queryset()'.

如果我删除 on_site 管理器,一切正常。

有什么办法可以克服这个问题吗?

事实证明,自从 Django 1.8 we can serialize Managers 使用 use_in_migrations

并且 CurrentSiteManager 标记为 use_in_migrations = True

因此解决方法是向后退 use_in_migrations = False。我是这样做的:

class NewsSiteManager(CurrentSiteManager.from_queryset(NewsQuerySet)):
    use_in_migrations = False


class News(models.Model):
    #...

    objects = NewsQuerySet.as_manager()
    on_site = NewsSiteManager()

接受的答案有效,但如果您真的希望将管理器序列化为迁移的一部分(以便您可以使用它们!),它就不是很好了。

为此,您需要按照错误消息所说的进行操作并继承生成的管理器,然后使用您的子类:

from django.contrib.sites.managers import CurrentSiteManager as DjangoCurrentSiteManager

class NewsQuerySet(models.QuerySet):
    pass

class CurrentSiteManager(DjangoCurrentSiteManager.from_queryset(NewsQuerySet)):
    pass

class News(models.Model):
     # Fields...

    objects = NewsQuerySet.as_manager()
    on_site = CurrentSiteManager()

有更好的方法。

from django.db import models

class NewsManager(models.Manager.from_queryset(NewsQuerySet)):
    use_in_migrations = True


class News(models.Model):
    ...

    objects = NewsManager()

然后你可以用 CurrentSiteManager 个对象做任何你想做的事。