我有 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来实现这一点吗?
尝试将
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
并将其添加到外部返回对象中。