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

2023-11-21

我的模型看起来像这样:

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()

我想要做的是公开给定 MenuItem 中的组件列表(不是 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 字段中的附加数据公开组件列表可以解决该问题。

EDIT
最后,我想获得一个列出 Component 元素的列表,但这些元素使用 MenuItemComponent 模型中的 isReplaceable 字段进行扩展:

{
    "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
        }
    ]
}

首先,创建一个视图,该视图将返回您感兴趣的 MenuItem 组件实例。

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()

字段'name'和'isReplaceable'可以简单地使用默认的只读Field class.

这里没有完全符合您的“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, 或类似的规定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 django-rest-framework 在序列化器级别扩展模型 的相关文章

随机推荐

  • REPL 和解释器有什么区别?

    REPL 和解释器之间有技术差异吗 交互式解释器使用 REPL 不需要配备口译员 例如 您可以以非交互模式 在文件上 运行 Python 并且它不会使用读取 评估 打印循环
  • 使用 numpy fft 提取相位信息

    我正在尝试使用快速傅立叶变换来提取单个正弦函数的相移 我知道 在纸面上 如果我们将函数的变换表示为 T 那么我们有以下关系 然而 我发现虽然我能够准确捕获余弦波的频率 但除非我以极高的速率采样 否则相位不准确 例如 import numpy
  • 如何在 Windows 机器上使用 nginx 运行 django?

    我有一个 Django 项目 我已经安装了nginx服务器 我想在 Windows 机器上运行 nginx 和 django 我尝试过几个博客Nginx Django Uwsgi 但它们都需要 uwsgi 但 uwsgi 未安装在 Wind
  • 代码生成器、ORM、存储过程

    这些软件架构在哪些领域表现出色或失败 哪些关键要求会促使您选择其中一个 请假设您有可用的开发人员 他们可以完成良好的面向对象代码以及良好的数据库开发 另外 请避免圣战 所有三种技术都有优点和缺点 我感兴趣的是最适合在哪里使用哪种技术 这些工
  • 使用自签名证书在 iOS 9 中发出 HTTPS 请求 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我想使用自签名证书向自定义服务器发出 HTTPS 请求 我正在使用 NSURLConnection 类并处理身份验证质询 但总是在控制台中收到错误消息 NSURLSessio
  • 错误:该 IP 地址无法在 Django 中分配给?

    我正在运行 Debian 6 stable 并且我正在尝试使用本地运行 Django manage py runserver命令 这就是我得到的 Validating models 0 errors found Django version
  • 删除/替换 bash 中的 html 标签

    我有一个文件 其中包含以下行 li b Some Text b More Text li 我想删除 html 标签并替换用破折号标记 所以它变成这样 Some Text More Text 我正在尝试使用 sed 但找不到正确的正则表达式组
  • Google Sheets API v4 接收公共 Feed 的 HTTP 401 响应

    在针对公共 即 发布到网络 并与 网络上的任何人 共享 电子表格运行时 我没有运气得到 Google Sheets API v4 的响应 相关文件指出 如果请求不需要授权 例如请求公共数据 那么应用程序必须提供 API 密钥或 OAuth
  • jQuery 选择器与过滤器()

    给出以下标记 ul class list li first item li li class item second item li li third item li ul 这两个表达式选择第二个里哪一个更好 ul li item or u
  • 如何在不激活其他应用程序窗口的情况下将其置于前面?

    我想将一个窗口带到前面 来自其他应用程序 目前我正在使用 SetWindowPos hwnd GetForegroundWindow 0 0 0 0 SWP ASYNCWINDOWPOS SWP NOACTIVATE SWP NOMOVE
  • 在 HSQLDB 中创建架构的启动脚本

    我正在尝试使用内存数据库来模拟 Teradata 数据库 我需要在构建表之前创建一个架构 但是 它让我很适合 我正在使用 Spring 并且有很多数据库交互import sql但是 这会在 Hibernate 创建所有表之后执行 我曾尝试使
  • qsort 与 std::sort 的性能比较?

    根据 Scott Meyers 在他的 Effective STL 一书中第 46 项的说法 他声称std sort比快约 670 std qsort由于内联的事实 我测试了自己 我发现 qsort 更快 有人能帮我解释这个奇怪的行为吗 i
  • 将 GridView 调整为所有屏幕尺寸

    我正在尝试将 GridView 实现为图像库的一部分 我按照下面的例子Android 开发者门户 该教程似乎适用于所有屏幕尺寸 如下所示 小屏幕尺寸和大屏幕尺寸的比例正确显示 左侧 小屏幕尺寸 右侧 大屏幕尺寸 但现在我的问题来了 当我想在
  • 使用具有多重继承的 Qt 信号和槽

    我有一堂课 MyClass 从 Qt 内置对象继承了大部分功能 QGraphicsTextItem QGraphicsTextItem间接继承自QObject MyClass还实现了一个接口 MyInterface class MyClas
  • HttpClient 异步请求未完成循环发送的大批量请求

    我想我已经成功地进行了一次测试 至少在我的系统上重复地显示了这个问题 这个问题与 HttpClient 用于不良端点 端点不存在 目标已关闭 有关 问题是已完成的任务数量低于总数 通常是几个左右 我不介意请求不起作用 但这只会导致应用程序在
  • 使用 Rails 的捆绑程序出现问题(Mac 用户)

    当我尝试运行我的应用程序时 出现以下错误 Could not find racc 1 5 2 in any of the sources Run bundle install to install missing gems I run bu
  • 如何确保 Hudson 中同时只运行某一类别的作业?

    我使用 Hudson 来自动化测试一个非常大的重要产品 我希望我的测试主机能够运行理论上支持的尽可能多的并发构建 但 excel 测试除外 它在任何时间每台机器只能运行一个 任意数量的非 Excel 测试可以同时运行 但是每台计算机一次最多
  • 加载 RS jni 库时出错:UnsatisfiedLinkError:无法加载 RSSupport:findLibrary 返回 null

    当将 RenderScript 与支持库一起使用时 我在 Motorola iRazr Android 4 1 2 上收到此错误 Error loading RS jni library java lang UnsatisfiedLinkE
  • 类、函数的前向声明

    当函数的前向声明在源文件 cpp 中起作用时 为什么同样的声明不适用于类 Thanks main cpp void forwardDeclaredFunction This is correct class One Why this wou
  • 如何使用 django-rest-framework 在序列化器级别扩展模型

    我的模型看起来像这样 class MenuItem models Model name models CharField max length 500 components models ManyToManyField Component