2009-02-07 5 views
8

외부 소스에서 장고 모델에 데이터를 채우는 가장 좋은 방법은 무엇입니까?Django 모델을 외부에 채우는 방법은 무엇입니까?

예. 모델 Run이 있고 매주 XML 파일로 데이터가 실행됩니다.

뷰를 만들고 해당보기 URL을 컬 크롱 ジョブ에서 호출해야합니다 (cronjob이 실행될 때뿐만 아니라 언제든지 데이터를 읽을 수 있다는 이점이 있습니다). 또는 파이썬 스크립트를 작성하고 해당 스크립트를 cron으로 설치해야합니까? (스크립트를 실행하기 전에 DJANGO _SETTINGS _MODULE 변수 설정으로)?

답변

10

프로젝트 환경에서 유지 보수와 유사한 작업을 수행하는 훌륭한 방법은 custom manage.py command입니다. 그것은 모든 환경 구성 및 기타 물건을 소요 구체적인 작업에 집중할 수 있습니다.

물론 cron으로 직접 호출하십시오.

4

보기를 만들 필요가 없으며 적절한 Django environment settings configured으로 파이썬 스크립트를 트리거해야합니다. 그런 다음 모델을 뷰를 사용하는 방식으로 직접 호출하고 데이터를 처리 한 다음 모델에 추가 한 다음 모델을 데이터베이스에 저장()합니다.

+0

나는 이것을 양쪽에서 할 수 있으며,보기에서 저장하거나 파이썬 스크립트에서 저장할 수 있습니다. – Marius

+0

사용자 정의 관리 명령은 직접 장고 환경 설정을 변경하는 것보다 나은 해결책입니다. Daevaorn의 대답을 참조하십시오. –

2

"python 스크립트를 만들고 해당 스크립트를 cron으로 설치하십시오 (스크립트를 실행하기 전에 DJANGO _SETTINGS _MODULE 변수 설정으로)?" 먼저

, 당신은 다음과 같이 배치 로더를 작성할 수

그리고 별도의 모듈 (예를 들어, forms.py)에서 양식을 선언해야합니다. (우리는이 많다.) 여기에 약간의 고유 한 처리가 있음을

from myapp.forms import MyObjectLoadForm 
from myapp.models import MyObject 
import xml.etree.ElementTree as ET 

def xmlToDict(element): 
    return dict(
     field1= element.findtext('tag1'), 
     field2= element.findtext('tag2'), 
    ) 

def loadRow(aDict): 
    f= MyObjectLoadForm(aDict) 
    if f.is_valid(): 
     f.save() 

def parseAndLoad(someFile): 
    doc= ET.parse(someFile).getroot() 
    for tag in doc.getiterator("someTag") 
     loadRow(xmlToDict(tag)) 

주 - 그냥보기 기능과 같은 양식 및 모델을 사용합니다.

응용 프로그램의 models.pyforms.py에 따라 달라 지므로이 일괄 처리 스크립트는 장고 응용 프로그램과 함께 배치됩니다.

"흥미로운"부분은 장고의 양식과 원활하게 작동하도록 XML 행을 사전으로 변환하는 것입니다. 이 명령 행 프로그램은보기와 동일한 장고 구성 요소를 모두 사용합니다.

구문 분석 및 로깅 옵션을 추가하여 완전한 명령 줄 응용 프로그램을 만들 수 있습니다. 또한 로직의 대부분은 일반적인 것임을 알게 될 것입니다 - xmlToDict 기능 만이 정말로 독특합니다. 우리는 이러한 "빌더"를 호출하고 빌더가 소스 문서에서 파이썬 사전에 대한 모든 다형성 매핑이되도록 클래스 계층 구조를 사용합니다.

+0

Django 관리 명령으로 이런 종류의 스크립트를 구현하지 않아도됩니다. manage.py의 다른 명령과 통합되며, 인수 및 옵션 구문 분석과 같은 작업을 처리합니다. 더 많은 "Djangoic". –

2

저는 스크립트와 뷰를 모두 사용하여 DB를 업데이트하기 위해 cron을 사용했습니다. cron의 관점에서 볼 때 어떤 사람을 선택 하느냐는 중요하지 않습니다. 당신이 언급했듯이, 예약되지 않은 간격으로 업데이트하고 싶다면 브라우저를 가동하고 URL을 누르는 단순성을이긴 것이 어렵습니다.

보기 경로를 탐색하면 HTTP POST를 통해 XML 파일 자체를 허용하는보기를 고려해 볼 가치가 있습니다. XML 파일에 대해 많은 정보를 제공하지 않는다면 데이터는 의미가 있지만 여전히 cron에서 작동하지만 브라우저에서 업로드 할 수도 있습니다. XML 파일을 만든 사람이 DB를 혼자서. XML 파일을 만드는 사람이 아닌 경우 큰 승리입니다. 일반적으로 내 경험에서 그렇습니다.

+0

great. 권장되는 모범 사례는 무엇입니까? – jdcaballerov

관련 문제