2017-09-21 80 views
1

在DRF文檔SerializerMethodField它提供了以下用法示例如何方法字段添加到ModelSerializer

class UserSerializer(serializers.ModelSerializer): 
    days_since_joined = serializers.SerializerMethodField() 

    class Meta: 
     model = User 

    def get_days_since_joined(self, obj): 
     return (now() - obj.date_joined).days 

不幸的是,在DRF的最新版本,因爲ModelSerializer預計無論是fieldsexclude是存在於失敗元。這提出了一個問題。如果我列出的fields列表的方法領域,我得到一個錯誤

django.core.exceptions.ImproperlyConfigured: Field name `days_since_joined` is not valid for model `User`. 

如果我不包括方法場或者如果我使用fields = "__all__"或者,如果我用exclude方法場結束了在系列化失蹤數據。

如何在模型序列化程序中包含方法字段?

編輯:我發現一個醜陋的黑客,允許爲自定義模型添加方法字段。您可以將模型添加到模型中,然後按預期工作。

class MyModel(models.Model): 
    field1 = models.IntegerField() 
    field2 = models.CharField() 
    # more fields 

    @property 
    def my_method_field(self): 
     return None 

class MyModelSerializer(serializers.ModelSerializer): 
    my_method_field = serializers.SerializerMethodField(method_name='bleh') 

    class Meta: 
     model = MyModel 
     fields = ('field1', 'field2', 'my_method_field') 

    def bleh(self, obj): 
     return 'Bleh!' 

但添加佔位符屬性代碼模型這樣的事情是不是一個很好的做法,這並沒有解決外部定義的模型,如Django的用戶模型這樣的問題。

編輯#2我會發誓,我已經嘗試添加排除和字段的每種可能的組合。然而,不知何故,當我第二天回到問題時,它只是合理排除。我將標記「空的排除」的答案作爲正確的答案,並將其留在這裏作爲對人類關注的浮躁和gremlins的祕密魔力的讚揚。

+0

你能否確認一下,如果你得到'days_since_joined'不存在或'date_joined'不是? – vignesh

+0

要做的檢查是正確的: - 方法名是Meta.fields(讓我們說這是「富」) - 不要忘記添加一個「富」 SerializerMethodField財產 - 對於方法本身 - 確保它是get_foo而不僅僅是foo。不要make method_name ='foo'和def foo(你不能有相同的名字)。您可以使用method_name,但確保它是唯一的。 – Bufke

回答

0

你試過了嗎exclude

class UserSerializer(serializers.ModelSerializer): 
    days_since_joined = serializers.SerializerMethodField() 

    class Meta: 
     model = User 
     exclude =() 
     #  ^^^^^ 

    def get_days_since_joined(self, obj): 
     return (now() - obj.date_joined).days 
相關問題