2012-03-22 2 views
0

현재 tastypie와 함께 django를 사용하고 있습니다. 질문과 대답을 위해 API를 구현해야합니다. 내 마음의 답변에서API의 단단히 결합 된 클래스의 모범 사례

class QuestionResource(ModelResource): 
    answers = fields.ToManyField("material.resources.AnswerResource", 
           "answer_set",blank=True,full=True) 

class AnswerResource(ModelResource): 
    question = fields.ToOneField(QuestionResource,'question') 

질문에 속하고, 사용자는 해당 답변이없는 질문을 만들 수 없습니다한다 : I는 각각 질문과 대답 모델에 연결된 다음 리소스를 만들었습니다. 이전 반복에서는 질문과 관련 답변에 대한 정보를 포함하기 위해 장고 formset을 사용했습니다. tastypie를 사용하면이 장면에 대해 (내가 아는 한) 깔끔한 즉시 사용 가능한 솔루션이 없습니다.

질문 리소스에 대한 요청 만 허용하여 해당 답변을 업데이트해야합니까, 아니면 2 리소스를 잘못 연결해야합니까? 즉, 사용자가 질문을 만든 후에 관련 답변을 제출해야한다는 의미입니다. 전 (前)은 원칙적으로 절대로 안되는 대답없이 질문을 내놓을 수 있기 때문에 원칙적으로 나을 것 같습니다.

답변

1

글쎄, 나는 한 번에 두 개의 다른 URL로 POST 할 수 없기 때문에 RESTful API에서 한 번에 두 개의 다른 리소스를 만들 수 없다고 생각한다. 그래서 API를 깨끗하고 RESTful하게 유지하려면 차라리 후자의 접근 방식을 따르고 별도로 생성하는 것이 좋습니다 (한 리소스로 결합하지 않는 한). 보이는 것처럼 나쁘지 않을 수도 있습니다.

이 질문에 답을 얻지 못할 수도 있음을 알고 있습니다. (질문은 처음 나타나는 질문이며 대답해야합니다.) 그러나 애플리케이션에서 응답하지 않는 한 질문을 조작하지 않아도이를 극복 할 수 있습니다 (예 : 어디에도 표시하지 않음).

당신은 한 단계 더 나아가과 같이, 기본에 의해 그 답이없는 질문을 필터링하는 사용자 정의 관리자 클래스를 정의 할 수 있습니다 :

# assumed that `answers` is related_name in ForeignKey from Answer to Question 
class Question(models.Model) 
    objects = AnsweredQuestionsManager() 
    all_questions = models.Manager() 

    @property 
    def is_answered(self): 
     return self.answers.count() > 0 

class AnsweredQuestionsManager(models.Manager): 
    def get_query_set(self):    
     return super(AnsweredQuestionManager, self)\ 
      .get_query_set().annotate(
       num_answers = Count('answers')).filter(num_answers__gt = 0) 

다음 Question.objects.all()는 질문에 대한 답변을 반환하고 Question.all_questions.all()은 답이없는 질문을 포함 할 것 게다가.

데이터베이스를 비교적 깨끗하게 유지하기 위해 예기치 않은 (예 : Cron 사용) 질문을 정기적으로 제거 할 수 있습니다.

나는 이것이 분리를 향하여 당신이 더 많이 기울기를 기대한다. :)

+0

답변을 걸러 낼 좋은 아이디어. 따라서 순수한 API 접근 방식에 더 쉽게 기울일 수 있습니다. – Gevious

+0

위대한, 당신이 그것을 좋아 기뻐 :) 행운을 빌어 요! – kgr