如何在Django的休息框架串级扩展模型(How to extend model on serial

2019-07-03 23:50发布

我的模型看起来是这样的:

class MenuItem(models.Model):
    name = models.CharField(max_length=500)
    components = models.ManyToManyField(Component, through=MenuItemComponent)

class Component(models.Model):
    name = models.CharField(max_length=500)

class MenuItemComponent(models.Model):
    menuItem = models.ForeignKey('MenuItem')
    component = models.ForeignKey(Component)
    isReplaceable = models.BooleanField()

我想要做的就是将组件暴露在给定的菜单项列表(NOT MenuItemComponents),将包括isReplaceable领域。 到目前为止,我有:

#views.py

class MenuItemComponentList(generics.ListAPIView):
    """
    Displays components for given MenuItem
    """
    model = MenuItemComponent
    serializer_class = MenuItemComponentSerializer

    def get_queryset(self):
        itemId = self.kwargs['itemId']
        return MenuItemComponent.objects.filter(menuItem__pk=itemId)



#serializers.py

class MenuItemComponentSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MenuItemComponent

暴露MenuItemComponents和力的客户名单进行多次调用,以便检索所有组件。 揭露组件列表与isReplaceable领域的其他数据可以解决这个问题。

编辑
最后,我想获得列出构成要素,但要素与MenuItemComponent模型isReplaceable场均exteded列表:

{
    "count": 2, 
        "next": null, 
        "previous": null, 
        "results": [
        {
            "url": "http://localhost:8000/api/component/1/", 
            "name": "component 1", 
            "isReplaceable": true
        }, 
        {
            "url": "http://localhost:8000/api/component/2/",  
            "name": "component 2",
            "isReplaceable": false
        }
    ]
}

Answer 1:

首先,创建一个视图,将返回您感兴趣的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类。

有没有现场相当多这里满足您的“网址”的情况下,所以我们将创建一个自定义字段:

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 ,或沿着这些线路的东西。



文章来源: How to extend model on serializer level with django-rest-framework