Django DRF获取对象后的更多细节

时间:2015-10-13 17:53:14

标签: django django-rest-framework

DRF的新手(以及一般的REST)。

型号:

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)

URL:

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 个答案:

答案 0 :(得分: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

然后我们覆盖get_serializer_class() EventViewSet,如果EventDetailSerializer请求则返回retrieve,否则返回EventSerializer

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
相关问题