[django]将 django 模型字段从嵌套模型移动到“主”模型

· 收录于 2024-01-06 14:11:07 · source URL

问题详情

我有 2 个 django 模型是这样链接的:

以及这 2 个模型的序列化程序:

class ModelASerializer(serializers.Serializer):
    id = serializers.CharField(help_text="Measurement ID")
    # some other fields here
    b_objects = ModelBSerializer(many=True)

classModelBSerializer(serializers.Serializer):
    id = serializers.CharField(source="order")
    random_field = serializers.FloatField()
    unique_field = serializers.FloatField()

我想编写一个端点,该端点将 ModelA 实体列表和所有相关的 ModelB 对象返回到特定的 ModelA 对象。

我目前有这个,它工作得很好: ModelA.objects.prefetch_related(b_objects).all()

它返回如下所示的对象列表:

    {
            "id": "92eb8314-3f26-4bf6-8cc0-83d2935434d9",
            ### modelA fields here
            "b_objects": [
                {
                    "id": "1",
                    "random_field": 1.0,
                    "unique_field": 0.1
                },
                {
                    "id": "2",
                    "random_field": 5.0,
                    "unique_field": 0.1
                }
            ]
     }

我在这里想要的是将unique_field从内部级别移动到 modelA 级别,以便它返回:


    {
            "id": "92eb8314-3f26-4bf6-8cc0-83d2935434d9",
            "unique_field": 0.1
            ### modelA fields here
            "b_objects": [
                {
                    "id": "1",
                    "random_field": 1.0
                },
                {
                    "id": "2",
                    "random_field": 5.0
                }
            ]
     }

100% 在特定 modelA 对象内的所有b_objects中,unique_field 的所有值都相等。

我试图在注释中添加 .annotate(unique_value=b_objects) 和其他,但它引发了一个错误:

QuerySet.annotate() 接收到非表达式:b_objects。

有没有办法使用查询集 API 实现这一点?

最佳回答

尝试添加 unique_field = 序列化程序。FloatField() 设置为 ModelASerializer。你必须添加

这将从 ModelB 中获取unique_field并将其添加到外部返回对象中。