Ho incontrato questo problema un paio di volte in diverse situazioni, ma la mia configurazione è la seguente:Python/Django: Perché importare un modulo prima di usarlo impedisce un'importazione circolare?
Ho due file di modelli Django. Uno che contiene modelli utente e codici coupon che un utente può utilizzare per iscriversi a un corso. Questi sono entrambi nel file account/models.py. Il corso e il relativo campo molti a molti sono in un diverso file di modelli, course/models.py. Solitamente mi riferisco a questi nel mio codice rispettivamente come amod e cmod.
Nel corso/models.py ho un'istruzione import:
from account import models as amod
class Course(ExtendedModel):
stuff = stuff
ho bisogno di importare il file dell'account/models.py per i molti-a-molti modelli/tavolo tra Course e l'utente che è non mostrato qui. Fin qui tutto bene.
Nel file account/models.py ho il modello CouponCode. Ogni istanza viene creata e quindi può essere assegnata a un particolare oggetto Course dopo la creazione per consentire a uno studente di utilizzarlo per iscriversi a un corso nel sistema.
class CouponCode(ExtendedModel):
assigned_course = UniqueIDForeignKey("course.Course", blank=True, null=True, related_name='assigned_coupon_code_set')
...
...
@staticmethod
def assign_batch(c, upper_limit):
import course.models as cmod # Why is this allowed here?
assert isinstance(c, cmod.Course)
# Do other stuff here
Questo metodo statico mi permette di passare in un oggetto da golf e una serie di CouponCodes che voglio assegnare ad esso e poi si assegnerà il prossimo numero N di codici non assegnati a quel corso. La mia domanda nasce dalla dichiarazione di affermazione.
Ho bisogno di importare l'oggetto Course da course/models.py per assicurare che l'oggetto che viene passato sia in realtà un'istanza di Course, ma se lo faccio all'inizio del file, ho problemi perché questo file è già stato importato in course/models.py. (l'importazione viene importata in cmod e quindi in amod devo importare cmod).
Perché mi consente di farlo se lo impongo nel metodo giusto prima che ne abbia bisogno rispetto all'inizio del file?
Nella tua esperienza, è mai esistito un motivo per non utilizzare il riferimento di stringa durante la creazione di una chiave esterna rispetto a un riferimento alla classe stessa? Per me sembra che farlo sempre sarebbe un buon modo per evitare problemi. – Spartacus
@Spartacus risposta tardiva mi dispiace - beh, l'uso di un riferimento di stringa obbliga l'orm a fare alcune ricerche aggiuntive e alla fine importa per risolvere il riferimento in modo da avere una leggera penalizzazione all'avvio del processo. Se questo è un problema o meno è lasciato al tuo apprezzamento ... Ma potresti rivolgere la domanda al contrario: perché usare un riferimento di stringa quando hai già a disposizione la classe? -) –