【问题标题】:Clean way to implement views or methods with Django Rest Framework使用 Django Rest Framework 实现视图或方法的简洁方法
【发布时间】:2015-02-03 11:48:33
【问题描述】:

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

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

因此,我想要实现的一个清晰示例是一个数据中心中所有服务器的视图,例如;

/datacenter/{id}/servers

我检查了其他类似的问题,例如 this onethis one,但我不确定这些实际上是最好的方法,我也无法按照 answer given by mariodev 中的描述使其工作

我试图避免使用像 Tom Dickin suggested 这样的 url 模式来解决这个问题

据我了解,这可以使用viewsetsroutersgeneric-views 解决

最简单的解决方案是什么?有人能指出我正确的方向吗?

【问题讨论】:

  • 你可以在视图集中使用临时方法

标签: python django rest django-rest-framework


【解决方案1】:

您可以使用 ad-hoc 方法

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

【讨论】:

  • 我试过了,但我得到了; 不是 JSON 可序列化的
  • @MarceloGrebois 请用我更新的代码重试
  • 如果我使用 ad-hoc 方法同时实现 get 和 post,我如何区分两者 - 两者都被路由到相同的函数?它会是一个 if/else on request.METHOD
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多