6

次の問題を抱えたいくつかの単純な django-tastypie リソースを使用しています。

簡単な評価システムを構築しているとします。リソースがあり、 aと a のRating両方を持つと呼びます。各ユーザーは、コメントごとに最大 1 つの評価を持っています。UserComment

Tuple を受け取る汎用リソースを作成したいと思い('user', 'comment')ます。次に、 new で POST を実行するたびに、 フィールドとフィールドRatingをチェックして、これらのフィールドの両方に一致する評価が既に存在するかどうかを確認します。存在する場合は既存のリソースを上書きし、そうでない場合は新しいリソースを作成します (API 呼び出しが常に Django のunique_togetherを渡すようにします)。usercomment

私はobj_get出発点として取り組んでいますが、この動作を得るためにそれを適切にオーバーライドする方法を理解するのが困難です。

4

1 に答える 1

6

の IRC に関する議論に続いて#tastypie:

標準の API 動作を変更しないことをお勧めします。これは、クライアントが API 全体で一貫した動作を確認できなくなるという意味で危険な場合があるためです。

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

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

したがって、あなたの場合、パフォーマンスの向上が必要だと判断した場合は、次のことができます。

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()
于 2012-05-06T22:44:14.963 に答える