'Is there another way to get value directly in drf serializer?

Let's assume we have two model

Listing
  
class ListingStatus(models.Model):
    FULL = 0
    AVALIABLE = 1

    STATUS_CATEGORY = (
        (FULL, _("Full")),
        (AVALIABLE, _("AVAIL")),
    )

    listing = models.OneToOneField(Listing, on_delete=models.CASCADE)
    status = models.SmallIntegerField(choices=STATUS_CATEGORY, default=AVALIABLE)

    def __str__(self):
        return str(self.status)

In serializer code

class ListingStatusSerializer(ReadOnlyModelSerializer):
    class Meta:
        model = ListingStatus
        fields = ["status"]

class ListingSerializer(ReadOnlyModelSerializer):
    status = ListingStatusSerializer(source="listingstatus.status")

It doesn't work. I get empty serializer

class ListingSerializer(ReadOnlyModelSerializer):
    status = ListingStatusSerializer(source="listingstatus")

This works but I need to get status value like instance.status.status. it's inefficient

class ListingSerializer(ReadOnlyModelSerializer):
    status = ListingStatusSerializer(source="listingstatus")

    def get_status(self, instance):
        return instance.listingstatus.status

I can achieve what I want with above code , but I want to make sure it's best solution?



Solution 1:[1]

use the get_field_display approach.

class ListingSerializer(ReadOnlyModelSerializer):
    status = serializers.CharField(source="get_status_display")

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 jackquin