2012-04-03 4 views
0

여러 팀이 구문 분석 할 콘텐츠를 업로드하는 Django 앱이 있습니다. 이 앱은 파싱 된 콘텐츠의 특정 공통 정보를 추적합니다. 문제는 각 팀마다 콘텐츠가 다른 형식 (예 : 일부 팀에서는 XML 콘텐츠, 일부는 텍스트, 일부는 JSON 등)으로 인해 다른 파서가 구문 분석해야하는 콘텐츠가 있다는 것입니다. 각 팀은 파싱 후 해당 Django 모델에 배치되는 필요한 정보를 가져 오는 파서 (Python 모듈)를 제공합니다.Django : 사용자에 따라 선택할 수있는 모델 종속 앱

내 질문은 : 각 팀이 자신의 파서 설정을 올바르게 할 수있는 장고에서 이것을 설계하는 가장 좋은 방법은 무엇입니까? 순수하게 백엔드 일 수도 있고, 사용자 폼이나 그와 같은 것을 필요로하지 않을 수도 있습니다. 내 첫번째 생각은 내가 지금처럼 각 팀에 외래 키와 Parser 모델을 만드는 것이라고했다 :

class Parser(models.Model): 
    team = models.ForeignKey('Team') 
    module_path = models.CharField(max_length=..., blank=False) 

을하고 module_path 그 경로에 내 응용 프로그램 코드에있는 것 "parsers.teamA.XMLparser"같은 일 것입니다 과 같이 : 그럼 내 앱이 업로드 된 콘텐츠를 구문 분석 올 때

parsers/ 
    teamA/ 
     __init__.py 
     XMLparser.py 
    teamB/ 

,이있을 것입니다 :

team = Team.objects.get(id=team_id) 
parser = Parser.objects.get(team=team) 

theParser = __import__(parser.module_path) 
theParser.parse(theStuffToBeParsed) 

어떤 문제 수행을 누구도 이걸 보지 않니? 내가 생각할 수있는 유일한 다른 옵션은 각 파서마다 별도의 장고 응용 프로그램을 만드는 것이지만 어떤 팀이 데이터베이스에서 어떤 응용 프로그램을 사용 하는지를 어떻게 알 수 있습니까?

답변

1

내가 취하는 접근 방식은 나에게 맞는 것 같습니다. 사실상 임의의 파이썬 코드를 실행하고 있으므로 공용 사이트에서 이와 같은 것을 사용하지 않으며 팀이 파서를 작성하는 것을 신뢰할 수 있음을 명심하십시오.

매번 가져 오기를 처리 할 필요가없는 모듈 경로를 나타내는 사용자 정의 필드를 작성하고 대신 가져 오기를 처리하고 구문 분석 메소드를 반환하여 조금 더 멋지게 만들 수 있습니다 (또는 더 나은 팀에게 인터페이스를 구현하도록 지시 할 수있는 파서 오브젝트)

가장 좋은 예는 django의 ImageField 또는 CharField의 소스를 보는 것일 수 있습니다. 모델에 CharField가있는 대신에 "ModuleField"가 있습니다 : parser = ModuleField(). 데이터베이스에 저장된 값은 실제로 모듈에 대한 경로가됩니다 (간단히 CharField의 하위 클래스로 지정). 그러나 to_python 메서드를 재정의합니다. 새로운 to_python 메소드에서 모듈을 가져 와서 파이썬 객체를 반환한다.

그 python 개체는 당신이 원하는대로 될 수 있습니다. 예를 들면 return theParser.parse 일 수 있습니다. 이것은 당신이 파서 인스턴스 foo을 가지고 있다면 당신은 the_parser_method = foo.parser

+0

@ John에게 조언을 해주셔서 감사합니다. 사용자 정의 필드가 모듈 경로를 나타내는 것을 의미하는지 궁금합니다. 가져 오기를 처리하려면 어떻게해야할까요? – Randy

+0

내 답변을 편집하여 내 답변에 답변했습니다. – John