2013-07-26 65 views
1

比方說,我有這個簡單的模型:型號串行:選擇要顯示的字段,並添加自定義字段

class BlogPost(models.Model): 
    author = models.ForeignKey(MyUser) 
    body = models.TextField() 
    title = models.CharField(max_length=64) 
    urlid = models.CharField(max_length=32) 
    private_data = models.CharField(max_length=64) 

private_data包含我不希望暴露給API的數據(!)。我使用ModelSerializer:

class BlogPostSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = BlogPost 

    def __init__(self, *args, **kwargs): 
     # Don't pass the 'request' arg up to the superclass 
     request = kwargs.pop('request', None) 
     # Instatiate the superclass normally 
     super(ModelSerializer, self).__init__(*args, **kwargs) 
     self.request = request 

    def absolute_url(self, blogpost): 
     return blogpost.get_absolute_url(self.request) 

absolute_url方法需要request確定域名(DEV或PROD例如),並且如果它是在http或https製成。

我想指定模型中的字段會得到通過串行退回(不公開例如private_data的)。足夠簡單:

class BlogPostSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = BlogPost 
     fields = ('author', 'body', 'title', 'urlid',) 

    # The same jazz after that 

好吧,它的工作原理。現在我也想回到absoluteUrl:

class BlogPostSerializer(serializers.ModelSerializer): 
    absoluteUrl = serializers.SerializerMethodField('absolute_url') 

    class Meta: 
     model = BlogPost 
     fields = ('author', 'body', 'title', 'urlid',) 

    # The same jazz after that 

好了,沒有驚喜,這將返回只有我指定的字段,沒有absoluteUrl。如何僅返回模型的某些字段和從序列化程序計算出的absoluteUrl?

如果我不指定fields我得到了absoluteUrl,但所有模型的字段(包括private_data的)。如果我添加'absoluteUrl'fields因爲blogpost.absoluteUrl不存在(沒有驚喜那裏)我得到一個錯誤。我不認爲,因爲我需要的request獲得absoluteUrl我可以用這個方法http://django-rest-framework.org/api-guide/serializers.html#specifying-fields-explicitly(或者我可以指定參數模型的方法是什麼?)

+0

很顯然,我可以在邏輯與'blogpost.get_absolute_url'移動到串行但我寧願離開邏輯模型。另外,我不是複製粘貼功能的巨大粉絲。 –

回答

4

If I don't specify fields I do get the absoluteUrl, but with all the model's fields (including private_data). If I add 'absoluteUrl' to fields I get an error because blogpost.absoluteUrl doesn't exist (no surprises there).

你應該只被添加'absoluteUrl'fields元組,它應該工作得很好 - 那麼你看到了什麼錯誤?

The absolute_url method needs the request to determine the domain name (dev or prod for example) and if it was made in http or https.

請注意,您還可以通過上下文串行不modfiying的__init__,只是通過一個實例context={'request': request}序列化時。通用視圖的默認設置爲您完成,因此您可以在任何序列化器方法中訪問self.context['request']。 (注意,這是超鏈接的關係是如何能夠返回完全合格的URL)

+0

我看到的錯誤是這樣的:'文件「/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py」,線路206,在get_fields 新[關鍵] = RET [關鍵] KeyError異常:「url'' 我使用'url'的名稱,而不是'absolute_url',它似乎把事情搞得一團糟......當我真正使用'absolute_url'它工作正常。好吧,謝謝你花時間回答!感謝上下文的事情,我一定會使用它。 –