如何在DRF序列化程序中从序列化程序键值的另一个模型中获取列表作为值?



型号:

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"
]
}
]

这里的SellerHub可能有多个电话号码,所以我使用SellerHubPhone并添加SellerHub作为外键。我想使用SellerHubPhone Model对象获取SellerHub的所有电话号码,输出应该看起来像预期的输出JSON。如何通过更改序列化程序来获得预期的输出?

您可以返回电话列表,我不确定,但这可以帮助您

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 [x.phone for x in serializer.data]

在得到@mecaTheclau答案的想法后,我尝试了这个解决方案。这个对我有效。由于返回的对象是OrderedDict,我不得不更改他的解决方案。

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 [next(iter(x.values())) for x in serializer.data]

相关内容

最新更新