DjangoアプリケーションでDjango REST Frameworkを使用してAPIを提供し、最近フィルタリングを追加しました。 UIのいくつかをサポートするために、いくつかの缶詰め/名前付きフィルタプリセットを提供できるようにしたいと考えています。たとえば、すべてのタスクのリストを表示する/api/tasks
ビューセットがあります。タスクの完了ステータスフィールドと完了日があります。 UIでは、不完全な、または完了したが最後の2時間以内のすべてのタスクのリストを取得できます。これはDjangoクエリーセットでは簡単ですが、DRFフィルタでは簡単ではありません。最終的な目標は/api/tasks?recent
などを取得することです。DRFキャンドフィルター - ベストプラクティス?
このようなことを行うためのベストプラクティスはありますか?私は別のクエリーセットフィールドで新しいビューセットを作成できますが、より良い方法がありますか?
編集:作業を行いますが、ちょうど不格好な感じ
class PushTaskViewSet(AuthenticatedAPIModelViewSet):
queryset = PushTask.objects.all()
serializer_class = PushTaskSerializer
filter_fields = ('complete', 'date_created', 'date_completed', 'progress')
class RecentPushTaskViewSet(AuthenticatedAPIModelViewSet):
# Get all tasks which are either incomplete, or only recently completed
serializer_class = PushTaskSerializer
def get_queryset(self):
return PushTask.objects.filter(Q(complete=False) | Q(date_completed__gt=self.get_completed_threshold()))
def get_completed_threshold(self):
return datetime.now(tz=pytz.utc) - timedelta(hours=4)
router.register(r'master-tasks', viewsets.PushTaskViewSet)
router.register(r'recent-master-tasks', viewsets.RecentPushTaskViewSet, base_name="recent-master-tasks")
:ここに私の現在のソリューションです。
:このためだけget_querysetメソッドをオーバーライドします一般的なケース。 – AnotherHowie
@ AnotherHowie私は自分の答えを広げた –