django キャッシュ設定
- 公開日:
 - 更新日:
 - 文字数:4840文字
 
from django.shortcuts import render,get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status,viewsets
from django.core.cache import cache
Create your views here.
from .serializers import ProjectSerializer,ProjectMediaStatusSerializer
from .models import Project,ProjectMediaStatus
import json
from django.http import JsonResponse
from django.utils.timezone import make_aware
from datetime import datetime
import sys
API経由から一覧表示
class ProjectListView(viewsets.ModelViewSet):
queryset = Project.objects.filter(status=1).order_by('-created_at')[:200]
queryset = Project.objects.order_by('-created_at')[:10]
serializer_class = ProjectSerializer
def list(self, request, *args, **kwargs):
    # キャッシュキーの設定
    cache_key = 'project_list'
    # キャッシュからデータを取得
    cached_data = cache.get(cache_key)
    if cached_data is not None:
        # キャッシュされたデータがあればそれを返す
        return Response(cached_data)
    # キャッシュされていない場合は、データを取得してキャッシュに保存
    queryset = self.filter_queryset(self.get_queryset())
    serializer = self.get_serializer(queryset, many=True)
    data = serializer.data
    cache.set(cache_key, data, timeout=3600)  # 12時間
    return Response(data)
プロジェクトのファイルのステータスを変更
class MediaStatusView(APIView):
def post(self, request):
media_id = request.data.get('media_id', None)
project_id = request.data.get('project_id', None)
status_id = request.data.get('status', None)
try:
instance = ProjectMediaStatus.objects.get(project=project_id,media=media_id)
instance.status = status_id
instance.save()
except ProjectMediaStatus.DoesNotExist:
instance = ProjectMediaStatus.objects.create(
status=status_id,
media_id=media_id,
project_id=project_id
)
    serializer = ProjectMediaStatusSerializer(instance)
    return Response(serializer.data, status=status.HTTP_201_CREATED)
プロジェクトのファイルのステータスを取得
class ProjectFileStatsulView(APIView):
def get(self, request, pk):
try:
project_status = ProjectMediaStatus.objects.filter(project=pk,status=99)[:100]
except ProjectMediaStatus.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
    serializer = ProjectMediaStatusSerializer(project_status,many=True)
    return Response(serializer.data, status=status.HTTP_201_CREATED)
詳細情報を取得
class ProjectDetailView(APIView):
def get(self, request, pk):
project = Project.objects.get(pk=pk)
    serializer = ProjectSerializer(project)
    # serializer_1 = ProjectMediaStatusSerializer(project_data)
    return Response(serializer.data)
class ProjectChangeStatusView(APIView):
def get(self, request, pk):
instance = Project.objects.get(pk=pk)
instance.status = 99
instance.save()
return Response({'message': 'Delete successfully'}, status=status.HTTP_200_OK)
class ProjectDeleteView(APIView):
def get(self, request):
instance = Project.objects.filter(status=99)
    Project.objects.filter(status=99).delete()
    # 取得したデータを削除
    #if request.method == 'DELETE':
    #    instance.delete()
    #return Response(serializer.data,status=status.HTTP_200_OK)
    return Response({'message': '削除しました。'}, status=status.HTTP_200_OK)
class ProjectInsertUpdateView(APIView):
def post(self, request):
json_data_str = request.data.get('data', None)
print(json_data_str)
    json_object_arr = json.loads(json_data_str)
    #ひとつだけ登録
    instance = Project.objects.get(id=json_object_arr['id'])
    instance.name = json_object_arr['name']  # 新しい説明を設定
    instance.desc = ''
    if 'desc' in json_object_arr:
        instance.desc = json_object_arr['desc']  # 新しい説明を設定
    news_files = request.data.get('news_files', None)
    parsed_list = []
    if news_files:
        parsed_list = list(set(map(int, news_files.split(','))))
    instance.file.set(parsed_list)
    instance.save()
    return Response({'message': 'Updated successfully'}, status=status.HTTP_200_OK)
class ProjectInsertView(APIView):
def post(self, request):
json_data_str = request.data.get('data', None)
print(json_data_str)
    json_object_arr = json.loads(json_data_str)
    name = json_object_arr['name']  # 新しい説明を設定
    desc = ''  # 新しい説明を設定
    if 'desc' in json_object_arr:
        desc = json_object_arr['desc']  # 新しい説明を設定
    user_id = request.data.get('user_id', None)
    news_files = request.data.get('news_files', None)
    parsed_list = []
    if news_files:
        parsed_list = list(set(map(int, news_files.split(','))))
    updated_at = datetime.now()        
    updated_at = make_aware(updated_at)
    mymodel = Project.objects.create(
        name=name,
        desc=desc,
        user_id = user_id,
        updated_at=updated_at
    )
    # ManyToManyFieldに新しいタグを追加
    mymodel.file.set(parsed_list)
    serializer = ProjectSerializer(mymodel)
     # キャッシュを削除
    cache_key = 'project_list'
    cache.delete(cache_key)
    return Response(serializer.data, status=status.HTTP_201_CREATED)
            