2017-03-20 2 views
0

Ich versuche, eine alte Django-App von 1.1.x auf 1.8 LTS zu aktualisieren, was das Aktualisieren von Pfaden beinhaltete, da ich Apps Apps umherbewege.Was ist der richtige Weg, verschachtelte Django-Apps in ManytoManyFields zu referenzieren

Aber ich bin nicht in der Lage Migrationen für eine App zu generieren, und ich kann nicht sehen, wie ein Namespaced App-Modell korrekt verweisen (vorausgesetzt, das ist das Problem)

Wenn ich Dateien von PROJECT verschoben haben/news/models zu PROJECT/site_name/news/models, wie soll ich diese Modelle in Fremdschlüsseln oder ManyToManyFields referenzieren?

Meine app

Ich habe eine projects App Ich möchte für Migrationen machen. Projekte in some_org/projects und in installierten Anwendungen aufgelistet, wie so:

INSTALLED_APPS = (
    'some_org.maps', 
    'some_org.library', 
    'some_org.extras', 
    'some_org.news', 
    'some_org.projects', 
    'some_org.members', 
    'some_org.comments', 
) 

Alle Apps mit dem Namespace innerhalb des some_org Verzeichnis.

Hier ist eine gekürzte Ansicht der Modelldatei in den Projekten App:

# some_org/projects/models.py 

from some_org.library import Paper 


class Project(models.Model): 
    name = models.CharField(max_length=30) 

    def get_children(self): 
     return ProjectPage.objects.filter(level=1, publish=True, project=self) 

    def has_library(self): 
     return Paper.objects.filter(projects=self).count() > 0 

Aufruf ./manage.py makemigrations Bibliothek, gibt mir diese Fehlermeldung:

ValueError: Lookup failed for model referenced by field library.Paper.projects: projects.Project 

Als ich in der Suche Papiermodell sieht so aus:

class Paper(models.Model): 

# snip 

# NewsLinkSubject, Projects et al used to in an app on 
# the project root, like `./app_name/models.py`, but is now 
# in `some_org/app_name/models.py` 

subjects = models.ManyToManyField("news.NewsLinkSubject", blank=True) 
projects = models.ManyToManyField("projects.Project", blank=True,) 
country = models.ForeignKey("maps.Country", null=True, blank=True) 

Ich frage mich zunächst, ob das Etikett für die App falsch ist, und versuchen, die Projekte ManyToMany Feld:

projects = models.ManyToManyField("some_org.projects.Project", blank=True,) 

Dieser einen anderen Fehler gibt:

ERRORS: 
library.Paper.subjects: (fields.E300) Field defines a relation with model some_org.projects.Project', which is either not installed, or is abstract. 

Soweit ich die App sagen kann, ist installiert, und die Modelle sind nicht abstrakt.

Ich bin ziemlich ratlos - was mache ich falsch, und wie kann ich das beheben, damit ich Migrationen für diese Apps machen kann?

Ich verwende Django 1.8.17 und Python 2.7.13.

Antwort

0

Sie sollten einen app_label in der Meta-Klasse für Ihre Modelle definieren. Was immer Sie dort eingeben, wird der erste Teil des Namens, den Sie in der ManyToManyField-Definition verwenden.

+0

Warum würde das helfen? Wenn ich etwas wie './manage.py migrate --list library 'laufe, wird die Bibliotheksanwendung als' library 'erkannt - würde das Hinzufügen der app_label nicht redundant sein? –

+0

Äh, weil es dein Problem lösen würde? –

Verwandte Themen