2

我正在尝试从更新Django 1.7Django 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:在 django.db.models.manager 中找不到经理 CurrentSiteManagerFromNewsQuerySet。请注意,您需要从使用“from_queryset()”动态生成的管理器继承。

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

任何想法如何克服这个问题?

4

3 回答 3

3

事实证明,从 Django 1.8开始,我们可以 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()
于 2016-06-11T13:03:51.607 回答
2

有更好的方法来做到这一点。

from django.db import models

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


class News(models.Model):
    ...

    objects = NewsManager()

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

于 2019-01-23T19:03:02.253 回答
1

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

为此,您需要遵循错误消息的内容并从生成的管理器继承,然后使用您的子类:

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()
于 2018-02-14T14:23:41.750 回答