2012-05-06 12 views
6

私はいくつかのシンプルなdjango-tastypie Resourcesで以下の問題を扱っています:Django-Tastypieをリソースが既に存在する場合にオーバーライドする方法を教えてください。

私は簡単な評価システムを構築しています。リソースがあり、とCommentの両方を持つRatingと呼んでください。各ユーザーは1つのコメントにつき1つの評価しかありません。

タプルを取る汎用リソースを作成したいと思います。('user', 'comment')その後、新しいRatingのPOSTを実行するたびにusercommentフィールドをチェックして、両方のフィールドに一致するレーティングが既に存在するかどうかを確認したいと思います。存在する場合は、既存のリソースを上書きします。それ以外の場合は、新しいリソースを作成します(API呼び出しは常にDjangoのunique_togetherを渡します)。

私はobj_getを出発点として作業していますが、これを適切に上書きしてこの動作を得る方法を理解することは困難です。

答えて

6

#tastypieでIRC上の議論に続き:

これは、クライアントがAPI全体で一貫した動作を見ていないだろうという意味で危険なこととして、標準APIの動作を変更しないことをお勧めします。

解決策の1つは、Ratingの作成時にTastypieが4xx応答を返すようにすることです。この場合、クライアントはPATCH既存の評価となります。

ただし、パフォーマンスの向上が実際にはである場合は、クライアントが正式にこれを要求した場合のみ動作を変更する必要があります。あなたの場合、POSTリクエストにreplace_existing_rating=Trueパラメータを追加することを意味します。あなたのケースではそう

、あなたはあなたはパフォーマンスの向上が必要と思った場合、あなたは可能性:

class CommentResource(ModelResource): 
    def obj_create(self, bundle, request=None, **kwargs): 
     if bundle.data.get("replace_existing_rating", False): 
      try: 
       bundle.obj = self._meta.object_class._default_manager.get(**conditions) 
      except self._meta.object_class.DoesNotExist: 
       bundle.obj = self._meta.object_class() 
関連する問題