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

问题描述 投票:0回答:1

我有 2 个 Django 模型,如下链接:

class ModelA(models.Model):
    id = models.UUIDField(primary_key=True)
    # some other fields here


class ModelB(models.Model):
    modela_id = models.UUIDField(primary_key=True)
    unique_field = models.FloatField()
    order = models.IntegerField(primary_key=True)
    random_field = models.FloatField()

以及这 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
                }
            ]
     }

特定 modelA 对象内的所有 b_object 中 unique_field 的所有值 100% 相等。

我尝试添加 .annotate(unique_value="b_objects") 和其他注释内部,但它引发了一个错误:

QuerySet.annotate() received non-expression(s): b_objects.

有什么方法可以使用queryset API来实现这一点吗?

django orm django-queryset
1个回答
0
投票

尝试将

unique_field = serializers.FloatField()
添加到
ModelASerializer
。还得加上

    def to_representation(self, instance):
        data = super().to_representation(instance)
        unique_field_values = [b_obj['unique_field'] for b_obj in data['b_objects']]
        if unique_field_values:
            data['unique_field'] = unique_field_values[0]
            for b_obj in data['b_objects']:
                b_obj.pop('unique_field', None)
        return data

这将从

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

© www.soinside.com 2019 - 2024. All rights reserved.