Как получить список как значение из другой модели значения ключа сериализатора в сериализаторе 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]
Вернуться на верх