You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改DRF序列化器以获取手机号列表格式的预期输出

调整Django REST Framework序列化器输出,将关联手机号转为纯字符串数组

问题背景

现有SellerHub与SellerHubPhone关联模型,当前SellerHubSerializer输出的phone字段是包含字典的数组格式,需修改为纯手机号字符串的数组。

模型代码

class SellerHub(BaseModel):
    name = models.CharField(blank=False, max_length=255)
    address = models.TextField(
        blank=True,
    )
    status = models.BooleanField(default=True)
    contact_person = models.CharField(blank=False, max_length=255)
    hub_type = models.ForeignKey(SellerHubType, on_delete=models.CASCADE)
    latitude = models.DecimalField(
        max_digits=22, decimal_places=16, blank=True, null=True
    )
    longitude = models.DecimalField(
        max_digits=22, decimal_places=16, blank=True, null=True
    )
    image = models.ImageField(
        default="default_images/default_seller_hub.png",
        upload_to=seller_hub_image_path,
    )
    status = models.BooleanField(default=True)

    class Meta:
        app_label = "seller_hub"

    def __str__(self):
        return self.name


class SellerHubPhone(BaseModel):
    seller_hub = models.ForeignKey(SellerHub, on_delete=models.CASCADE)
    phone = PhoneNumberField(blank=False, max_length=255)
    status = models.BooleanField(default=True)

    def __str__(self):
        return f"{str(self.phone)} for {self.seller_hub.name}"

原有序列化器代码

from rest_framework import serializers
from seller_hub.selectors import seller_phone
from phonenumber_field.serializerfields import PhoneNumberField


class SellerHubPhoneSerializer(serializers.Serializer):
    phone = PhoneNumberField()


class SellerHubSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(max_length=255)
    address = serializers.CharField()
    image = serializers.ImageField()
    phone = serializers.SerializerMethodField("get_phone")

    def get_phone(self, obj):
        hub_phone = seller_phone(obj)  # Returns a queryset of SellerHubPhone objects
        print("Phone: ", hub_phone)
        serializer = SellerHubPhoneSerializer(hub_phone, many=True)
        return serializer.data

当前输出

"data": [
    {
        "id": 1,
        "name": "Test Seller Hub",
        "address": "Test seller Address",
        "image": "http://127.0.0.1:8000/media/default_images/default_seller_hub.png",
        "phone": [
            {
                "phone": "+8801777777777"
            },
            {
                "phone": "+491783379222"
            }
        ]
    }
]

预期输出

"data": [
    {
        "id": 1,
        "name": "Test Seller Hub",
        "address": "Test seller Address",
        "image": "http://127.0.0.1:8000/media/default_images/default_seller_hub.png",
        "phone": [
             "+8801777777777",
             "+491783379222"
        ]
    }
]

修改方案

直接修改SellerHubSerializer中的get_phone方法,无需使用嵌套的SellerHubPhoneSerializer,直接从SellerHubPhone对象中提取手机号的字符串形式:

class SellerHubSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(max_length=255)
    address = serializers.CharField()
    image = serializers.ImageField()
    phone = serializers.SerializerMethodField("get_phone")

    def get_phone(self, obj):
        hub_phone = seller_phone(obj)
        # 遍历queryset,将每个phone对象转为字符串格式,可根据需求过滤status为True的记录
        return [str(phone_obj.phone) for phone_obj in hub_phone if phone_obj.status]

额外优化

如果不需要保留SellerHubPhoneSerializer,可以直接删除该类,减少冗余代码。

内容的提问来源于stack exchange,提问作者Hasidul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:54:27