views.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from rest_framework import viewsets
  2. from .models import ListModel
  3. from . import serializers
  4. from utils.page import MyPageNumberPagination
  5. from rest_framework.filters import OrderingFilter
  6. from django_filters.rest_framework import DjangoFilterBackend
  7. from rest_framework.response import Response
  8. from .filter import Filter
  9. from rest_framework.exceptions import APIException
  10. class APIViewSet(viewsets.ModelViewSet):
  11. """
  12. retrieve:
  13. Response a data list(get)
  14. list:
  15. Response a data list(all)
  16. create:
  17. Create a data line(post)
  18. delete:
  19. Delete a data line(delete)
  20. partial_update:
  21. Partial_update a data(patch:partial_update)
  22. update:
  23. Update a data(put:update)
  24. """
  25. pagination_class = MyPageNumberPagination
  26. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  27. ordering_fields = ['id', "create_time", "update_time", ]
  28. filter_class = Filter
  29. def get_project(self):
  30. # 获取项目ID,如果不存在则返回None
  31. try:
  32. id = self.kwargs.get('pk')
  33. return id
  34. except:
  35. return None
  36. def get_queryset(self):
  37. # 根据请求用户过滤查询集
  38. id = self.get_project()
  39. if self.request.user:
  40. if id is None:
  41. return ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  42. else:
  43. return ListModel.objects.filter(openid=self.request.auth.openid, id=id, is_delete=False)
  44. else:
  45. return ListModel.objects.none()
  46. def get_serializer_class(self):
  47. # 根据操作类型选择合适的序列化器
  48. if self.action in ['list', 'retrieve', 'destroy']:
  49. return serializers.WarehouseGetSerializer
  50. elif self.action in ['create']:
  51. return serializers.WarehousePostSerializer
  52. elif self.action in ['update']:
  53. return serializers.WarehouseUpdateSerializer
  54. elif self.action in ['partial_update']:
  55. return serializers.WarehousePartialUpdateSerializer
  56. else:
  57. return self.http_method_not_allowed(request=self.request)
  58. def create(self, request, *args, **kwargs):
  59. # 创建一个数据行
  60. data = self.request.data
  61. data['openid'] = self.request.auth.openid
  62. if len(data['warehouse_name']) > 45:
  63. raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
  64. if ListModel.objects.filter(openid=data['openid'], warehouse_name=data['warehouse_name'],
  65. is_delete=False).exists():
  66. raise APIException({"detail": "Data Exists"})
  67. else:
  68. # if ListModel.objects.filter(openid=data['openid'], is_delete=False).count() >= 1:
  69. # raise APIException({"detail": "You Just Can Add 1 Warehouse"})
  70. # else:
  71. serializer = self.get_serializer(data=data)
  72. serializer.is_valid(raise_exception=True)
  73. serializer.save()
  74. headers = self.get_success_headers(serializer.data)
  75. return Response(serializer.data, status=200, headers=headers)
  76. def update(self, request, pk):
  77. # 更新一个数据行
  78. qs = self.get_object()
  79. if qs.openid != self.request.auth.openid:
  80. raise APIException({"detail": "Cannot update data which not yours"})
  81. else:
  82. data = self.request.data
  83. if len(data['warehouse_name']) > 45:
  84. raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
  85. serializer = self.get_serializer(qs, data=data)
  86. serializer.is_valid(raise_exception=True)
  87. serializer.save()
  88. headers = self.get_success_headers(serializer.data)
  89. return Response(serializer.data, status=200, headers=headers)
  90. def partial_update(self, request, pk):
  91. # 部分更新一个数据行
  92. qs = self.get_object()
  93. if qs.openid != self.request.auth.openid:
  94. raise APIException({"detail": "Cannot partial_update data which not yours"})
  95. else:
  96. data = self.request.data
  97. if len(data['warehouse_name']) > 45:
  98. raise APIException({"detail": "The warehouse name is set to more than 45 characters"})
  99. serializer = self.get_serializer(qs, data=data, partial=True)
  100. serializer.is_valid(raise_exception=True)
  101. serializer.save()
  102. headers = self.get_success_headers(serializer.data)
  103. return Response(serializer.data, status=200, headers=headers)
  104. def destroy(self, request, pk):
  105. # 逻辑删除一个数据行
  106. qs = self.get_object()
  107. if qs.openid != self.request.auth.openid:
  108. raise APIException({"detail": "Cannot delete data which not yours"})
  109. else:
  110. qs.is_delete = True
  111. qs.save()
  112. serializer = self.get_serializer(qs, many=False)
  113. headers = self.get_success_headers(serializer.data)
  114. return Response(serializer.data, status=200, headers=headers)
  115. class MultipleViewSet(viewsets.ModelViewSet):
  116. """
  117. retrieve:
  118. Response a data list(get)
  119. list:
  120. Response a data list(all)
  121. """
  122. authentication_classes = []
  123. pagination_class = MyPageNumberPagination
  124. permission_classes = []
  125. throttle_classes = []
  126. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  127. ordering_fields = ['-id', ]
  128. filter_class = Filter
  129. def get_project(self):
  130. # 获取项目ID,如果不存在则返回None
  131. try:
  132. id = self.kwargs.get('pk')
  133. return id
  134. except:
  135. return None
  136. def get_queryset(self):
  137. # 根据请求用户过滤查询集
  138. id = self.get_project()
  139. if self.request.user:
  140. if id is None:
  141. return ListModel.objects.filter(is_delete=False)
  142. else:
  143. return ListModel.objects.filter(id=id, is_delete=False)
  144. else:
  145. return ListModel.objects.none()
  146. def get_serializer_class(self):
  147. # 根据操作类型选择合适的序列化器
  148. if self.action in ['list', 'retrieve']:
  149. return serializers.WarehouseGetSerializer
  150. else:
  151. return self.http_method_not_allowed(request=self.request)