Django Migrations ValueError:在django.db.models.manager中找不到管理器

时间:2016-06-11 13:03:52

标签: django django-migrations django-managers django-sites

我尝试从Django 1.7更新为Django 1.8

我的某个模型使用CurrentSiteManager中的django.contrib.sites.managers,如此:

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:找不到经理CurrentSiteManagerFromNewsQuerySet   在django.db.models.manager中。请注意,您需要继承   使用' from_queryset()'。

动态生成的经理

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

任何想法如何克服这个?

3 个答案:

答案 0 :(得分:3)

原来,自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()

答案 1 :(得分:1)

还有一种更好的方法。

from django.db import models

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


class News(models.Model):
    ...

    objects = NewsManager()

然后,您可以使用CurrentSiteManager对象做任何您想做的其他事情。

答案 2 :(得分:0)

接受的答案有效,但如果您真的想让管理员序列化为迁移的一部分,那么它就不那么好了(所以你可以使用它们!)。

要做到这一点,您需要按照错误消息说明并从生成的管理器继承,然后使用您的子类:

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()