2017-12-15 3 views
0

Ich habe eine Anwendung notes und Name Modell definiert alsDjango Import: kann nicht Namen importieren

Noten/models.py

from shorturls.models import ShortUrl 

class Note(models.Model): 
    # columns here 

    def __str___(self): 
     return self.title 

@receiver(post_save, sender=Note) 
def post_save_note_receiver(sender, instance, created, *args, **kwargs): 
    if instance and created: 
     ShortUrl.objects.create(note=instance) 

und eine andere App shorturls mit Modell für jeden Datensatz kurze URL zu speichern,

Shorturls/models.py

from notes.models import Note 

class ShortUrl(models.Model): 
    note = models.OneToOneField(Note, on_delete=models.CASCADE, blank=True) 
    short_key = models.CharField() 

    def __str__(self): 
     return self.short_key 

@receiver(pre_save, sender=ShortUrl) 
def pre_save_short_url_receiver(sender, instance, *args, **kwargs): 
    instance.short_key = unique_short_key_generator(instance) 

Aber auf python manage.py makemigrations, es gibt Fehler als

File "path_to_app/shorturls/models.py", line 7, in <module> 
    from notes.models import Note 
ImportError: cannot import name 'Note' 
+0

aktualisierte Frage und entfernte diese Zeile. Das wurde versehentlich hinzugefügt. –

+0

Es scheint ein zirkulärer Import zu sein, weil ich in 'Note' 'ShortUrl' importiere, um' create' von 'ShortNote' auf' post_save' zu ​​nennen, da ich jedes Mal, wenn eine neue Note erstellt wird, einen Record für 'ShortUrl' erstellen muss. Und in 'ShortUrl' importiere ich' Note', um 'OneToOneField' zuzuweisen. Wenn dies der Grund für den kreisförmigen Import ist, wie es in diesem Zustand gelöst werden –

Antwort

1

Sie haben eine zirkuläre Abhängigkeit zwischen den beiden Modellen Dateien.

Sie können als String in Ihrem one-to-one-Feld verwenden:

class ShortUrl(models.Model): 
    note = models.OneToOneField('notes.Note', on_delete=models.CASCADE, blank=True) 

Sie dann from notes.models import Note entfernen können die zirkuläre Abhängigkeit zu brechen.

+0

Danke. Es funktionierte. Da ich neu in Django bin und das ist mein Projekt, das ich selbst mache. Ich würde gerne fragen, ob diese Logik, die ich implementiere, ein guter Weg ist oder nicht? –

+0

Eine zirkuläre Abhängigkeit ist oft ein Zeichen dafür, dass Sie den Code nicht richtig strukturiert haben. In diesem Fall besteht die einfachste Möglichkeit zur Behebung des Problems darin, eine Zeichenfolge im Eins-zu-eins-Feld zu verwenden. Eine andere Option wäre, 'post_save_note_receiver' in die' shorturls' App zu verschieben. Auf diese Weise würde die "shorturls" -App von "Notizen" abhängen, aber "Notizen" würden nicht von "shorturls" abhängen. – Alasdair

+0

Wie könnte ich 'post_save_note_receiver' in 'shorturls' verschieben, da ich beim Speichern von' Note' einen Datensatz für 'shorturls' anlegen muss? –

Verwandte Themen