将多个模型和自定义字段添加到 Django Rest Framework 中的 json 响应

2024-04-16

我是 Python/Django 编程新手,在我正在做的个人项目中遇到了一些问题。我的问题是,我想根据应用程序的不同模型返回自定义响应,一些值将来自自定义查询,其他值是模型本身的一部分。

因此,我的应用程序中有以下模型(删除了一些字段以免帖子太长):

class Parking(models.Model):
    google_id = models.CharField(max_length=100)
    short_name = models.CharField(max_length=100)
    long_name = models.CharField(max_length=300)
    price = models.DecimalField(max_digits=4, decimal_places=2, null=True, blank=True)

class ParkingLot(models.Model):        
    parking = models.ForeignKey(Parking, on_delete=models.CASCADE, null=False, related_name='parkinglots')
    size = models.ForeignKey(Size, on_delete=models.DO_NOTHING, null=False, related_name='size')
    width = models.DecimalField(max_digits=3, decimal_places=2, null=True, blank=True)
    height = models.DecimalField(max_digits=3, decimal_places=2, null=True, blank=True)

class ParkingAvailability(models.Model):
    parkinglot = models.ForeignKey(ParkingLot, on_delete=models.CASCADE, null=False, related_name='availability')
    available = models.BooleanField(null=False, blank=False)
    from_hour = models.TimeField(auto_now=False, auto_now_add=False, default='09:00:00')
    to_hour = models.TimeField(auto_now=False, auto_now_add=False, default='21:00:00')

这些模型是我的数据库表的精确表示。都好。我的问题是,现在我想要制作自定义 json 响应,这需要对这些表运行查询,但不显示整个对象,并且在某些情况下,基于我需要在表上运行的过滤器或操作的自定义字段(例如例如,基于 parking_id 和 size_id 的停车场数量)。所以,假设我需要如下所示的东西:

[
    {
        "id": 1,
        "google_id": "JSDKKLAD888737283",
        "short_name": "Fernandez Albano",
        "long_name": "Comunidad Fernandez Albano",
        "price": 18.5,
        "parkinglots": 88, 
        "hours": {
            "from_hour": "09:00:00",
            "to_hour": "21:00:00",
        }
    }
]

前 4 个 json 值来自 Parking 模型,字段 parkinglots 是带有一些过滤器(parking_id、size_id)的 parkinglots 模型的 .count()。可用性是来自 ParkingAvailability 模型的自定义查询,我可以通过我的 parkinglot_id 值访问它。

到目前为止,我有类似的东西,但在我看来这是不行的:

class parkingList(APIView):
    def get(self, request, format=None):
        parkinglotNumber=ParkingLot.objects.filter(parking_id = 2, size_id = 1).count()
        parkinglot = ParkingLot.objects.filter(parking_id = 2, size_id = 1)
        hours = ParkingAvailability.objects.filter(parkinglot__in=parkinglot, available=True).aggregate(Min('from_hour'), Max('to_hour'))

        content = {
            'parkinglots_number': parkinglotNumber,
            'hours': hours
        }

        return Response(content)

所以,我的问题是:

  1. 可以这样运行查询吗?如果想将(例如)我的停车场模型完全添加到该响应中,我将需要运行另一个查询,例如“ParkingLot.objects.filter(parking_id = 2, size_id = 1)”并将其添加到我的停车响应中?
  2. 我的序列化器序列化所有模型字段,但在这种情况下我不使用它,可以在没有序列化器类的情况下返回它吗?
  3. 我如何构建复杂的 json 响应?就像在本例中一样,我需要从不同的模型和自定义字段将不同的部分添加到我的 json 中。

感谢您的帮助!抱歉我的英语不是我的母语。

PS:我的序列化器类返回我的模型的所有信息。课程的一部分是这样的:

class ParkingLotSerializer(serializers.ModelSerializer):
    size = SizeSerializer(many=False, read_only=True)
    availability = ParkingAvailabilitySerializer(many=True, read_only=True)
    class Meta:
        model = ParkingLot
        fields = ['id', 'price', 'floor', 'number', 'width', 'size', 'availability']

class ParkingSerializer(serializers.ModelSerializer):
    adress = AdressSerializer(many=False, read_only=True)
    parkinglots = ParkingLotSerializer(many=True, read_only=True)
    class Meta:
        model = Parking
        fields = ['id', 'google_id', 'price', 'short_name', 'long_name', 'adress', 'parkinglots' ]

您的其他相关模型应该可以通过Parking通过他们的对象related_name。例如,要访问相关ParkingLots,你可以这样做obj.parkinglots.count()。如果需要的话,您甚至可以进一步过滤,例如obj.parkinglots.filter(size_id=1).count()。因此,您可以使用SerializerMethodField https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield.

class ParkingSerializer(serializers.ModelSerializer):
    ...
    parkinglots_count = serializers.SerializerMethodField()

    ...
    def get_parkinglots_count(self, obj):
        return obj.parkinglots.count()

您可以将该字段重命名为对您的 api 有意义的任何名称,但使用的方法应该是get_<FIELD_NAME>,并确保将其添加到您的fields Meta属性!如果您想要执行更多自定义字段,这可以类似地工作。


解决您的问题:

可以这样运行查询吗?如果想将(例如)我的停车场模型完全添加到该响应中,我将需要运行另一个查询,例如“ParkingLot.objects.filter(parking_id = 2, size_id = 1)”并将其添加到我的停车响应中?

这可能会导致所谓的n+1问题,因为您需要为每个序列化器实例运行查询。因此,在您的列表中,如果您返回 25 个停车场,则可能会运行 25 次查询。您可以通过执行以下操作来解决此问题注释到您的查询集 https://stackoverflow.com/questions/33356152/django-how-to-annotate-a-object-count-from-a-related-model以帮助减少查询数量。也就是说,是的,没关系!做这样的事情确实很常见。

我的序列化器序列化所有模型字段,但在这种情况下我不使用它,可以在没有序列化器类的情况下返回它吗?

我想我明白。您是在询问序列化您不使用的字段吗?你绝对可以做到。如果您有兴趣动态关闭字段(无论是在运行中,还是在使用序列化器时),请查看类似的内容Django-restql https://github.com/yezyilomo/django-restql(抱歉无耻的插件!)。

我如何构建复杂的 json 响应?就像在本例中一样,我需要从不同的模型和自定义字段将不同的部分添加到我的 json 中。

只要你传入的数据有你需要的,你就可以制作一个序列化器。创建一个序列化器,只需将字典传递给其中,以便在 api 上返回它,这种情况并不罕见。序列化器不一定需要与模型绑定,并且如答案中所述,您可以根据需要创建自己的自定义字段来工作。 Django Rest 框架有一个很好的教程 https://www.django-rest-framework.org/tutorial/1-serialization/这涉及非模型序列化器。

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

将多个模型和自定义字段添加到 Django Rest Framework 中的 json 响应 的相关文章

随机推荐

  • 在Python中插入lxml树时出现属性错误

    我正在尝试将 xml 的小结构注入到现有 xml 文件中的特定位置
  • href 链接不可点击或不可突出显示

    我不完全确定为什么我的 a href 链接不起作用 在某个时间点它起作用了 我对 Z Index 做了一些研究 但这似乎不是问题 也不是我有一个重叠的 div 吗 请访问JSFIDDLE NET https jsfiddle net t9v
  • Ajax 如果超过一个 @mention

    我正在尝试使用 jquery ajax php 制作一个 facebook 和 twitter 风格的提及系统 但如果我尝试 提及多个用户 我就会遇到问题 例如 如果我开始输入如下内容 Hi stack how are you 结果显示 s
  • 将列添加到现有红移表

    我有一个包含超过 30m 条记录的数据库 我需要向数据库添加两个新列 问题是我需要这些列不为空 并且没有默认值 我以为我只需添加这些没有 NOT NULL 约束的列 用数据填充它们 然后添加约束 但 Redshift 不支持这一点 我心里有
  • 如何使用代码在 ios 应用程序中录制屏幕视频?

    就像苹果商店中的 ShowMe 应用程序一样 用户可以绘画并将动作录制为视频 你们知道如何在代码中做到这一点吗 谢谢 我们最近遇到了这个问题 并发现了一篇精彩的文章 其中使用了视图层和媒体框架 在这里查看链接 http codethink
  • Swift 协议只能设置吗?

    为什么我可以毫无错误地执行此操作 var testDto ModelDto modelId 1 testDto objectId 2 当我定义这个时 protocol DataTransferObject var objectType Dt
  • 浮动操作按钮不显示矢量资源

    I m trying to setup a vector asset into a fab But the result is like this As you can see the vector is there but way dow
  • 有没有办法在Oracle表的指定位置添加列? [复制]

    这个问题在这里已经有答案了 考虑一下我在 Oracle 10G 中创建的初始表 CUSTOMER ID ACC NO ACC BALANCE 100 200 1000 101 150 4000 102 350 2000 103 450 25
  • FFmpeg - 找不到 ExecuteBinaryResponseHandler - Android/Java

    我正在尝试制作一个用于反应原生的模块 它将把视频变成 gif 我对 android studios java 几乎没有经验 但我很想了解更多 我在用这个图书馆 https github com WritingMinds ffmpeg and
  • React Native 箭头函数和“if”语句

    我刚刚接受了箭头函数的教育 以及当您开始使用子函数时它们如何帮助提高可见性React Native 和全局可访问的对象 https stackoverflow com questions 50209526 react native and
  • gdb:“未加载符号表”

    尝试在 gdb 中添加断点时 我不断收到此错误消息 我使用这些命令来编译 gcc g main c utmpib2 c o main o and cc g main c utmpib2 c o main o and also g g mai
  • 升级到 RN 0.68 后 APK 中缺少 index.android.bundle

    将我们的 RN 应用程序升级到 RN 0 68 后 我们在发布版本中遇到错误 FATAL EXCEPTION create react context Process com app PID 15057 java lang RuntimeE
  • 应用程序的私有文件

    我想创建一个文件来存储一些只能由我的应用程序访问的数据 外部用户不应该能够访问该文件或对其进行任何更改 我将在文件中存储一个密钥 该密钥可能由我的应用程序访问需要时随时使用应用程序 使用Environment getDataDirector
  • Meteor如何调用Meteor.methods()中定义的方法?

    我将方法分配给 Meteor 服务器 如下所示 在 bootstrap js 中 Meteor startup function Meteor methods foo function return 1 bar function QUEST
  • Direct2D 位图画笔拉长

    我必须在屏幕外位图上绘制形状 但是当我尝试渲染位图时遇到一个奇怪的问题 这就是图像的显示方式 这就是我查看位图的方式 以下是我用来创建位图画笔的代码 const auto size renderTarget gt GetSize const
  • 内容更改时停止文本小部件滚动

    我有一个带有滚动条的文本小部件 看起来像这样 self myWidget Text root self myWidget configure state DISABLED self myWidget pack self myWidgetSc
  • 在线性回归中使用数据框的列名称作为预测变量

    我正在尝试遍历 data frame 的所有列名称并使用它们 作为线性回归中的预测变量 我目前拥有的是 for i in 1 11 for j in 1 11 if i j var1 names newData i var2 names n
  • 奇怪的错误 TypeError:无法在 onSuccessMapUnitFields 处读取 null 的属性“setValue”[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 这段代码运行得很好 直到我决定再添加 4 行代码 所以我删除了它们 但我收到了这个错误 有趣的是我在Form onloa
  • 防止在弹出窗口外部单击时关闭 SweetAlert

    我在用甜蜜警报电子商务应用程序中我的产品视图上的弹出窗口有两个按钮 一个用于进入购物车视图 另一个用于重新加载视图 但是 当用户在弹出窗口外部单击时 弹出窗口会自动关闭 我已尝试以下属性来阻止其关闭 但没有任何作用 hideOnOverla
  • 将多个模型和自定义字段添加到 Django Rest Framework 中的 json 响应

    我是 Python Django 编程新手 在我正在做的个人项目中遇到了一些问题 我的问题是 我想根据应用程序的不同模型返回自定义响应 一些值将来自自定义查询 其他值是模型本身的一部分 因此 我的应用程序中有以下模型 删除了一些字段以免帖子