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 № 1OK, 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()