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
个对象做任何你想做的事。
我正在尝试从 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
个对象做任何你想做的事。