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

时间:2015-02-17 00:33:07

标签: django django-rest-framework

我们说我有这个序列化器:

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是模型字段,我想覆盖它以返回不同的值,但看起来像DRF忽略自定义字段并返回obj中的原始值。

如果我没有将它们放在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,但我想知道是否有更简单的方法。

2 个答案:

答案 0 :(得分:14)

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

中提到的get_前缀
def get_offer(self, obj):
    return 123

def get_cart_item(self, obj):
    return 123

def get_stock_details(self, obj):
    return 123

答案 1 :(得分:0)

也可以将方法名称作为可选参数传递给每个serializers.SerializerMethodField(),并为每个自定义/重写字段指定要使用的自定义方法名称。这样,您可以在序列化程序类内的解析器方法名称中省略get_前缀。