Django迁移值错误:在Django.db.models.manager中找不到管理器
我正在尝试从Django迁移值错误:在Django.db.models.manager中找不到管理器,django,django-migrations,django-managers,django-sites,Django,Django Migrations,Django Managers,Django Sites,我正在尝试从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): #... object
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:找不到管理器CurrentSiteManagerFromNewsQuerySet
在django.db.models.manager中。请注意,您需要从继承
使用“from_queryset()”动态生成的管理器
如果我删除网站上的管理器,一切正常
有什么办法可以克服这个问题吗?事实证明,Django 1.8管理者使用在迁移中使用
并且CurrentSiteManager
标记为
因此,解决方法是设置在迁移中使用\u=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
对象执行任何其他操作