Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django Rest框架实现视图或方法的干净方法_Python_Django_Rest_Django Rest Framework - Fatal编程技术网

Python 使用Django Rest框架实现视图或方法的干净方法

Python 使用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

我试图在我的视图集中实现一些特定的视图,但要保持代码的整洁和优雅。我有一些服务器和数据中心

型号.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)))
视图.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吗