相关疑难解决方法(0)

Django REST Framework:向ModelSerializer添加其他字段

我想序列化一个模型,但是想要包含一个额外的字段,该字段需要对要序列化的模型实例进行一些数据库查找:

class FooSerializer(serializers.ModelSerializer):
  my_field = ... # result of some database queries on the input Foo object
  class Meta:
        model = Foo
        fields = ('id', 'name', 'myfield')
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?我看到你可以将额外的"上下文"传递给序列化器,是在上下文字典中传入附加字段的正确答案吗?使用这种方法,获得我需要的字段的逻辑不会与串行器定义一起自包含,这是理想的,因为每个序列化实例都需要my_field.在DRF序列化器文档的其他地方,它 "额外的字段可以对应于模型上的任何属性或可调用".我正在谈论的是额外的领域吗?我应该在Foo模型定义中定义一个返回my_field值的函数吗?在序列化器中我将my_field挂钩到那个可调用的函数?那是什么样的?

在此先感谢,如有必要,请尽快澄清问题.

django rest django-rest-framework

122
推荐指数
7
解决办法
8万
查看次数

如何使用django-rest-framework在序列化程序级别上扩展模型

我的模型看起来像这样:

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()
Run Code Online (Sandbox Code Playgroud)

我想做的是在给定的MenuItem中公开一个包含isReplaceable字段的组件列表(NOT MenuItemComponents).到目前为止,我有:

#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
Run Code Online (Sandbox Code Playgroud)

其中公开了MenuItemComponents列表并强制客户端进行多次调用以检索所有组件.使用isReplaceable字段中的其他数据公开组件列表可以解决问题.

编辑
最后,我想得到一个列出组件元素的列表,但元素是用MenuItemComponent模型中的isReplaceable字段扩展的:

{
    "count": 2, 
        "next": null, 
        "previous": null, 
        "results": [
        {
            "url": "http://localhost:8000/api/component/1/", 
            "name": "component 1", 
            "isReplaceable": true
        }, …
Run Code Online (Sandbox Code Playgroud)

python django-rest-framework

5
推荐指数
1
解决办法
8494
查看次数

标签 统计

django-rest-framework ×2

django ×1

python ×1

rest ×1