Django REST Framework generics.RetrieveUpdateDestroyAPIView return 所有记录而不是一个
Django REST Framework generics.RetrieveUpdateDestroyAPIView return all records instead of one
我是 DRF 的新手,正在尝试构建休息 API,我已将我的模型、URL、视图和序列化程序设置为:
model.py:
services = (
('Single', 'Single'),
('Multiple', 'Multiple'),
)
class DeploymentOnUserModel(models.Model):
deployment_name = models.CharField(max_length=256, )
credentials = models.TextField(blank=False)
project_name = models.CharField(max_length=150, blank=False)
project_id = models.CharField(max_length=150, blank=True)
cluster_name = models.CharField(max_length=256, blank=False)
zone_region = models.CharField(max_length=150, blank=False)
services = models.CharField(max_length=150, choices=services)
configuration = models.TextField()
routing = models.TextField()
def save(self, **kwargs):
if not self.id and self.services == 'Multiple' and not self.routing and not self.configuration:
raise ValidationError("You must have to provide routing for multiple services deployment.")
super().save(**kwargs)
From urls.py:
from django.urls import path, include
# from .routers import router
from . import apiview
app_name = 'deployments'
urlpatterns = [
# path('', include(router.urls), name='deployments'),
path('deployments/', apiview.DeploymentsList.as_view(), name='deployment-list'),
path('deployments/<int:pk>/', apiview.DeploymentDetail.as_view(), name='deployment_detail')
]
From apiview.py:
class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
pk = self.kwargs.get('pk')
return Response(DeploymentOnUserModel.objects.get(pk=kwargs['pk']))
From serializers.py:
class DeploymentOnUserSerializer(serializers.ModelSerializer):
class Meta:
model = DeploymentOnUserModel
fields = '__all__'
当我尝试访问时:http://127.0.0.1:8000/api/v1/deployments/?pk=1/ 它应该 return id=1 的单个对象,但它 return 是所有对象。
与其将 pk 作为 GET 参数传递,不如将其作为 url 的一部分传递,如下所示:
http://127.0.0.1:8000/api/v1/deployments/1/
URL 您正在尝试使用 DeploymentsList
执行的 http://127.0.0.1:8000/api/v1/deployments/?pk=1/
因为它不包含 pk
url kwarg.
您还应该在 return 之前序列化对象作为响应:
class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
pk = self.kwargs.get('pk')
object = DeploymentOnUserModel.objects.get(pk=kwargs['pk'])
serializer = DeploymentOnUserSerializer(object)
return Response(serializer.data)
When I try get method instead of retrieve the url error has gone but
it return another error as: Object of type 'DeploymentOnUserModel' is
not JSON serializable
我知道已经晚了但是在你的apiview.py
class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = DeploymentOnUserSerializer()
def get_queryset(self):
pk = self.request.GET.get("pk")
return deployment = DeploymentOnUserModel.objects.get(pk=pk)
我是 DRF 的新手,正在尝试构建休息 API,我已将我的模型、URL、视图和序列化程序设置为:
model.py:
services = (
('Single', 'Single'),
('Multiple', 'Multiple'),
)
class DeploymentOnUserModel(models.Model):
deployment_name = models.CharField(max_length=256, )
credentials = models.TextField(blank=False)
project_name = models.CharField(max_length=150, blank=False)
project_id = models.CharField(max_length=150, blank=True)
cluster_name = models.CharField(max_length=256, blank=False)
zone_region = models.CharField(max_length=150, blank=False)
services = models.CharField(max_length=150, choices=services)
configuration = models.TextField()
routing = models.TextField()
def save(self, **kwargs):
if not self.id and self.services == 'Multiple' and not self.routing and not self.configuration:
raise ValidationError("You must have to provide routing for multiple services deployment.")
super().save(**kwargs)
From urls.py:
from django.urls import path, include
# from .routers import router
from . import apiview
app_name = 'deployments'
urlpatterns = [
# path('', include(router.urls), name='deployments'),
path('deployments/', apiview.DeploymentsList.as_view(), name='deployment-list'),
path('deployments/<int:pk>/', apiview.DeploymentDetail.as_view(), name='deployment_detail')
]
From apiview.py:
class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
pk = self.kwargs.get('pk')
return Response(DeploymentOnUserModel.objects.get(pk=kwargs['pk']))
From serializers.py:
class DeploymentOnUserSerializer(serializers.ModelSerializer):
class Meta:
model = DeploymentOnUserModel
fields = '__all__'
当我尝试访问时:http://127.0.0.1:8000/api/v1/deployments/?pk=1/ 它应该 return id=1 的单个对象,但它 return 是所有对象。
与其将 pk 作为 GET 参数传递,不如将其作为 url 的一部分传递,如下所示:
http://127.0.0.1:8000/api/v1/deployments/1/
URL 您正在尝试使用 DeploymentsList
执行的 http://127.0.0.1:8000/api/v1/deployments/?pk=1/
因为它不包含 pk
url kwarg.
您还应该在 return 之前序列化对象作为响应:
class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
pk = self.kwargs.get('pk')
object = DeploymentOnUserModel.objects.get(pk=kwargs['pk'])
serializer = DeploymentOnUserSerializer(object)
return Response(serializer.data)
When I try get method instead of retrieve the url error has gone but it return another error as: Object of type 'DeploymentOnUserModel' is not JSON serializable
我知道已经晚了但是在你的apiview.py
class DeploymentDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = DeploymentOnUserSerializer()
def get_queryset(self):
pk = self.request.GET.get("pk")
return deployment = DeploymentOnUserModel.objects.get(pk=pk)