2016-06-11 6 views
0

Я пытаюсь обновить от Django 1.7 до Django 1.8Джанго Миграции ValueError: Не удалось найти менеджера в django.db.models.manager

Один из моих моделей использует 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 или мигрировать) я получаю:

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 м все работает нормально.

Любые идеи, как преодолеть это?

ответ

3

OK Оказалось, проблема связана с тем, что с Django 1.8 теперь мы можем serializeManagers используя 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() 
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()