简体   繁体   中英

Clean way to implement views or methods with Django Rest Framework

I'm trying to implement some particular views to my ViewSet but keeping a clean and elegant code. I have some servers and some datacenters;

models.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

serializers.py

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')

views.py

class DatacenterViewSet(viewsets.ModelViewSet):

    queryset = Datacenter.objects.all()
    serializer_class = DatacenterSerializer

class ServerViewSet(viewsets.ModelViewSet):

    queryset = Server.objects.all()
    serializer_class = ServerSerializer

urls.py

router = routers.DefaultRouter()
router.register(r'Enviroment', views.EnviromentViewSet)
router.register(r'Server', views.ServerViewSet)

urlpatterns = patterns('',url(r'^', include(router.urls)))

So a clear sample of what I would like to implement is a view of all the servers in one datacenter like;

/datacenter/{id}/servers

I check other similar questions like this one and this one but I'm not sure those are actually the best ways, also I was unable to make it work as described in the answer given by mariodev

I'm trying to avoid to solve this using url patterns like Tom Dickin suggested

As far as I understand this can be solved using viewsets , routers or generic-views

Whats the simplest solution? Could someone point me into the right direction?

You can use ad-hoc method

serializers.py

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')

views.py

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)

urls.py

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)))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM