Po modelach.py w jednej aplikacji stała się dość duża, próbowałem przenieść niektóre klasy w podpakki.

Stara struktura była taka:

# File: assets/models.py
class Asset(...):
    # lots of irrelevant code

# File: widgets/models.py
from assets.models import Asset
class Video(...):
    asset = models.ForeignKey(Asset)

To działało bez problemu, więc nie wchodzę na dalsze szczegóły dotyczące struktury.

Teraz próbowałem zrobić, aby przesunąć klasę Asset w submodule. Struktura jest teraz następująca:

# File: assets/models/__init__.py (of course I deleted the old models.py)
from .assets import Asset

# File: assets/models/assets.py
class Asset(...):
    # lots of irrelevant code

# File: widgets/models.py
from assets.models.assets import Asset
class Video(...):
    asset = models.ForeignKey(Asset)

W jakiś sposób nie działa i nie mogę dowiedzieć się, co faktycznie powoduje problemy. Błąd, który otrzymuję, to:

Widgets.Video: "Asset" ma relację z modelem, który nie został zainstalowany lub jest abstrakcyjny

0
Dave Vogt 28 listopad 2013, 21:42

2 odpowiedzi

Najlepsza odpowiedź

Wygląda na to, że Django nie może wiarygodnie wykryć, która aplikacja model należy model, jeśli jest w zagnieżdżonych podmodule (tj. Nie bezpośrednio wewnątrz appname.models).

Jest to znany problem i można go rozwiązać, dodając następujące linie (w tym przypadku do klasy Asset), określając w ten sposób wyraźnie, która aplikacja model należy do:

class Asset(models.Model):
    ...
    class Meta:
        app_label = 'assets'
    ...

Bibliografia:

5
Dave Vogt 29 listopad 2013, 10:50

Powinieneś importować z models jak przed:

from assets.models import Asset

Pozwala to na zawsze importować z models, ale organizować modele osobno w katalogu {X1}}. Oznacza to również, koncepcyjnie, że Asset jest nadal w models jako ForeignKey odnosi się do obiektu assets.models.Asset, a nie assets.models.assets.Asset.

1
Simeon Visser 28 listopad 2013, 19:26