2015-10-13 60 views
1

DRF(以及一般的REST)的新特性。Django DRF獲取對象後的更多細節

型號:

class Event(models.Model): 
    name = models.CharField() 

class Result(models.Model): 
    event = models.ForeignKey(Event, related_name='results') 
    person = models.CharField() 
    score = models.IntegerField() 

串行器:

class ResultSerializer(serializers.ModelSerializer): 
    class Meta: 
      model = Result 

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
      model = Event 

Viewsets:

class ResultViewSet(viewsets.ModelViewSet): 
    queryset = Result.objects.all() 
    serializer_class = ResultSerializer 

class EventViewSet(viewsets.ModelViewSet): 
    queryset = Event.objects.all() 
    serializer_class = EventSerializer 

路由器:

router = routers.DefaultRouter() 
router.register(r'events', EventViewSet) 

網址:

urlpatterns = [ 
    url(r'^api/', include(router.urls)), 
] 

這工作得很好,我可以去http://mysite/api看看「事件」有一個鏈接到http://mysite/api/events/。從那裏每個事件都有鏈接到http://mysite/api/events/id。到現在爲止還挺好。

如果我改變事件序列化,它也將包括所有從結果的結果(該事件):

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    results = ResultSerializer(many=True, read_only=True) 
    class Meta: 
      model = Event 

這也能正常工作。但我不希望每個活動都包含http://mysite/api/events(通常很長)的結果。有太多的方法。我只希望在去http://mysite/api/events/id時看到結果。

有關如何從我所在的位置到我想要的位置的任何提示?如果http://mysite/api/events上的每個項目都包含結果計數,那麼效果會更好,然後http://mysite/api/events/id實際上有結果。

希望這是有道理的。 謝謝。

回答

1

我們可以創建2個序列化器EventSerializerEventDetailSerializer,它們將根據請求的類型返回不同的序列化表示。

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Event 

class EventDetailSerializer(serializers.HyperlinkedModelSerializer): 
    results = ResultSerializer(many=True, read_only=True) # contain the serialized results 
    class Meta: 
     model = Event 

然後,我們將在請求retrieveEventSerializer的情況下覆蓋的EventViewSet其返回EventDetailSerializerget_serializer_class()否則。

class EventViewSet(viewsets.ModelViewSet): 
    queryset = Event.objects.all() 

    def get_serializer_class(self): 
     if self.action == 'retrieve': # check if a 'retrieve' request 
      return EventDetailSerializer 
     return EventSerializer # otherwise return this serializer 
+0

這正是我一直在尋找的,很好,乾淨。謝謝! – user3449833

+0

@ user3449833另外,爲了在列表請求的序列化表示中包含每個事件的'results'數量,你可以添加一個'result' [''SerializerMethodField()'](http://www.django-rest -framework.org/api-guide/fields/#serializermethodfield)在你的'EventSerializer'中。 –