2013-07-26 37 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'它工作正常。好吧,谢谢你花时间回答!感谢上下文的事情,我一定会使用它。 –