/ / Django Migrations ValueError: Impossibile trovare il manager in django.db.models.manager - django, django-migrations, django-manager, siti django

Django Migrations ValueError: Impossibile trovare il manager in django.db.models.manager - django, django-migrations, django-manager, django-sites

Sto cercando di aggiornare da Django 1.7 a Django 1.8

Uno dei miei modelli utilizza CurrentSiteManager a partire dal django.contrib.sites.managers così:

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)()

Quando provo a eseguire migrazioni (makemigrations o migrazione), ottengo:

ValueError: impossibile trovare il gestore CurrentSiteManagerFromNewsQuerySet in django.db.models.manager. Si prega di notare che è necessario ereditare da gestori generati dinamicamente con "from_queryset ()".

Se rimuovo il on_site manager, tutto funziona bene.

Qualche idea su come superare questo?

risposte:

3 per risposta № 1

OK, il problema deriva dal fatto che da allora Django 1.8 ora possiamo serializzare Managers utilizzando use_in_migrations.

E il CurrentSiteManager è contrassegnato con use_in_migrations = True

Quindi la soluzione è di tornare indietro use_in_migrations = False. L'ho fatto in questo modo:

class NewsSiteManager(CurrentSiteManager.from_queryset(NewsQuerySet)):
use_in_migrations = False


class News(models.Model):
#...

objects = NewsQuerySet.as_manager()
on_site = NewsSiteManager()

0 per risposta № 2

La risposta accettata funziona, ma non è così eccezionale se si desidera mantenere i manager serializzati come parte delle migrazioni (quindi è possibile utilizzarli!).

Per fare ciò, è necessario seguire ciò che dice il messaggio di errore ed ereditare dal gestore generato, e quindi utilizzare la sottoclasse:

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()