首先,创建一个视图,该视图将返回您感兴趣的MenuItemComponent实例。
class ListComponents(generics.ListAPIView):
serializer_class = MenuItemComponentSerializer
def get_queryset(self):
"""
Override .get_queryset() to filter the items returned by the list.
"""
menuitem = self.kwargs['menuitem']
return MenuItemComponent.objects.filter(menuItem=menuitem)
然后,您需要创建一个序列化器以提供所需的表示形式。您的示例比典型案例更有趣/更有趣,因此看起来像这样…
class MenuItemComponentSerializer(serializers.Serializer):
url = ComponentURLField(source='component')
name = Field(source='component.name')
isReplaceable = Field()
字段“名称”和“ isReplaceable”可以仅使用默认的只读Field
类。
这里没有一个字段完全符合您的“ url”情况,因此我们将为此创建一个自定义字段:
class ComponentURLField(serializers.Field):
def to_native(self, obj):
"""
Return a URL, given a component instance, 'obj'.
"""
# Something like this...
request = self.context['request']
return reverse('component-detail', kwargs=kwargs, request=request)
我认为那应该是正确的。
这是用于只读序列化的- 如果您想要可写序列化,则需要研究重写restore_object
序列化器上的方法,并使用WritableField
或类似的方法。