Here I come, there I am.

Python има проблеми с циркулярните (рекурсивни) вмъквания (circular imports) на модули в началото на файловете.

Например, ако във файла one.py се опитаме да извикаме "import two.py", а в two.py направим обратното - "import one.py", то ще изпаднем във въпросния кръгов цикличен импорт и ще счупим кода успешно :)

Като цяло решенията, които открих, са:

  • дизайн на кода по начин, който не довежда до такива взаимни извиквания
  • късни импорти (import в логиката на кода, а не в началото на модула)

В Django обаче, при взаимни връзки между апликации, се налага да се вмъкват отделни модели от models.py в различните апликации. Грешката, която извежда при подобен проблем, обикновено няма абсолютно нищо общо и трудно ще откриете проблема. 

За да може да се обърнете към връзка 1:M или M:M, вариант е да посочвате името на модела като символен литерал, като по този начин не се налага да го добавяте в импортите отгоре. Например:

 

countries = models.ManyToManyField(
'mainapp.Country', db_table='mainapp_country_links', blank=True, null=False)

 

С горния начин печеля две неща: не довеждам до рекурсивно вмъкване директно, а и посочвам с db_table таблица за "many to many", в която да търси дадената връзка.

Share and Enjoy:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • MySpace
  • Slashdot
  • Technorati
  • TwitThis
del.icio.us Digg DZone Facebook Google Google Reader Magnolia reddit SlashDot Technorati ReadMe.ru Dobavi.com Dao.bg Lubimi.com Ping.bg Pipe.bg Svejo.net Web-bg.com

Безподобния пост.

Related posts brought to you by Yet Another Related Posts Plugin.

Comments

One Response to “Циркулярни (рекурсивни) импорти в Django / Python”

  1. Любомир Петров on July 23rd, 2010 22:59 [#]

    ..db_table='mainapp_country_links'
    Не ти е нужно това, би трябвало само да си хване таблицата :)
    Проблема е в Python, а решението е като подадеш апп.име_на_модел като стринг е благодарение на джанго ... как да не харесваш понита после :) )

Leave a Reply