Django Rest Framework 覆盖 modelserialzer 中的模型字段

Django Rest Framework override model fields in modelserialzer

假设我有这个序列化器:

class DashboardItemSerializer(ModelSerializer):
    offer = serializers.SerializerMethodField()
    cart_item = serializers.SerializerMethodField()
    stock_details = serializers.SerializerMethodField()

    class Meta:
        model = OrderItem
        fields = ('uuid', 'seller', 'total', 'tax', 'offer', 'shipping_address', 'cart_item', 'stock_details')

    def offer(self, obj):
        return 123

    def cart_item(self, obj):
        return 123

    def stock_details(self, obj):
        return 123

这些字段 offercart_itemstock_details 是模型字段,我想用 return 不同的值覆盖它,但看起来 DRF 忽略了自定义字段和 return 对象中的原始值。

如果我不将它们放在 fields 列表中,数据将根本不包括这些字段。

class DashboardItemSerializer(ModelSerializer):
    offer = serializers.SerializerMethodField()
    cart_item = serializers.SerializerMethodField()
    stock_details = serializers.SerializerMethodField()

    class Meta:
        model = OrderItem
        fields = ('uuid', 'seller', 'total', 'tax', 'shipping_address')

    def offer(self, obj):
        return 123

    def cart_item(self, obj):
        return 123

    def stock_details(self, obj):
        return 123

一种方法是 define fields explicitly,但我想知道是否有更简单的方法。

您忘记添加 get_ 前缀。您的方法名称应具有 get_ 前缀,如 SerializerMethodField docs

中所述
def get_offer(self, obj):
    return 123

def get_cart_item(self, obj):
    return 123

def get_stock_details(self, obj):
    return 123

也可以将方法名称作为可选参数传递给每个 serializers.SerializerMethodField() 并指定要用于每个 custom/overridden 字段的自定义方法名称。这样您就可以在序列化器 class.

内的解析器方法名称中省略 get_ 前缀