Как получить список как значение из другой модели значения ключа сериализатора в сериализаторе 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 в качестве внешнего ключа. Я хочу получить все телефонные номера SellerHub, используя объект модели SellerHubPhone, и результат должен выглядеть как ожидаемый выход 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]