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.