【问题标题】:Django Migrations ValueError: Could not find manager in django.db.models.managerDjango Migrations ValueError:在 django.db.models.manager 中找不到管理器
【发布时间】:2016-06-11 13:03:51
【问题描述】:

我正在尝试从 Django 1.7 更新到 Django 1.8

我的一个模型使用来自django.contrib.sites.managersCurrentSiteManager,如下所示:

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 经理,一切正常。

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

【问题讨论】:

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


    【解决方案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】:

      事实证明,因为 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()
      

      【讨论】:

        【解决方案3】:

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

        为此,您需要按照错误消息的说明从生成的管理器继承,然后使用您的子类:

        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-07-18
          • 2012-11-18
          • 2012-01-22
          • 1970-01-01
          • 1970-01-01
          • 2021-03-29
          • 1970-01-01
          • 1970-01-01
          • 2020-07-01
          相关资源
          最近更新 更多