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实际上会得到结果会更好。
希望这是有道理的。 感谢。
答案 0 :(得分:1)
我们可以创建2个序列化器EventSerializer
和EventDetailSerializer
,它们将根据请求的类型返回不同的序列化表示。
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