Python 使用Django Rest框架实现视图或方法的干净方法
我试图在我的视图集中实现一些特定的视图,但要保持代码的整洁和优雅。我有一些服务器和数据中心 型号.pyPython 使用Django Rest框架实现视图或方法的干净方法,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我试图在我的视图集中实现一些特定的视图,但要保持代码的整洁和优雅。我有一些服务器和数据中心 型号.py class Datacenter(models.Model): name = models.CharField(max_length=50) status = models.CharField(max_length=50) def __unicode__(self): return self.name class Server(models.Mod
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
序列化程序.py
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
视图.py
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
url.py
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
因此,我想实现的一个清晰示例是一个数据中心中所有服务器的视图,如:
/datacenter/{id}/servers
我检查了其他类似的问题,如和,但我不确定这些实际上是最好的方法,而且我也无法使其工作如中所述
我试图避免使用url模式来解决这个问题,比如
据我所知,这可以通过使用解决,或
最简单的解决方案是什么?有人能给我指出正确的方向吗?你可以使用特别的方法 序列化程序.py
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
视图.py
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
url.py
class Datacenter(models.Model):
name = models.CharField(max_length=50)
status = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Server(models.Model):
datacenter = models.ForeignKey(Datacenter,related_name="servers")
hostname = models.CharField(max_length=50)
def __unicode__(self):
return self.hostname
class ServerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
Servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','Servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
class ServerViewSet(viewsets.ModelViewSet):
queryset = Server.objects.all()
serializer_class = ServerSerializer
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
class ServerSerializer(serializers.ModelSerializer):
class Meta:
model = Server
class DatacenterSerializer(serializers.ModelSerializer):
servers = ServerSerializer(many=True)
class Meta:
model = Datacenter
fields = ('id', 'name','status','servers')
class DatacenterViewSet(viewsets.ModelViewSet):
queryset = Datacenter.objects.all()
serializer_class = DatacenterSerializer
@detail_route(methods=['get'], permission_classes=[permissions.IsAdminUser])
def servers(self, request, pk=None):
servers = Server.objects.filter(datacenter__id=pk)
serializer = ServerSerializer(servers, many=True, context={'request': request})
return Response(serializer.data)
router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'server', views.ServerViewSet)
router.register(r'datacenter', views.DatacenterViewSet)
urlpatterns = patterns('',url(r'^', include(router.urls)))
你可以在ViewSets中使用特别的方法,我试过了,但是我得到了;不是JSONserializable@MarceloGrebois请使用我更新的代码重试。如果我使用特殊方法实现get和post,我如何区分这两种方法?它们都被路由到同一个函数,对吗?这是一个if/else-on-request.METHOD吗