我尝试从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
经理,一切正常。
任何想法如何克服这个?
答案 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()