如何修改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
相关产品推荐
相关产品推荐

