【问题标题】:Is there another way to get value directly in drf serializer?还有另一种方法可以直接在 drf 序列化程序中获取价值吗?
【发布时间】:2022-02-11 06:07:27
【问题描述】:

假设我们有两个模型

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)

在序列化代码中

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

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

它不起作用。 我得到空的序列化程序

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

这可行,但我需要获取像 instance.status.status 这样的状态值。效率低下

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

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

我可以用上面的代码实现我想要的,但我想确保它是最好的解决方案?

【问题讨论】:

  • 你也可以这样做:status = serializers.IntegerField(source="listingstatus.status")

标签: django-rest-framework


【解决方案1】:

使用get_field_display 方法。

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

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 2021-07-03
    • 2012-04-19
    • 2016-09-15
    • 2020-01-24
    • 2021-10-25
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多