2012-03-22 4 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') 

が質問に属し、ユーザーは、対応する答えずに質問を作成することはできないはずです。私は、それぞれの質問と回答のモデルに縛ら以下のリソースを作成しました。前回の反復では、質問と関連する回答の両方の情報を格納するためにdjangoフォームセットを使用しました。 tastypieには、このシナリオのために(私が知る限り)きちんとしたアウト・ザ・ボックス・ソリューションはありません。

質問リソースへのリクエストのみを許可して、対応する回答を更新する必要がありますか、2つのリソースを疎結合する必要があります。つまり、ユーザーは質問の作成後に関連付けられた回答を送信する必要があります。前者は、原理的に決してそうであってはならない答えなしで、後者が質問を生み出すことができるので、私は原則的により良いと思われる。

答えて

1

RESTful APIでは2つの異なるリソースを一度に作成することはできません(一度に2つの異なるURLにPOSTできないため)。ですから、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

関連する問題