比方说,我有这个简单的模型:型号串行:选择要显示的字段,并添加自定义字段
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(或者我可以指定参数模型的方法是什么?)
很显然,我可以在逻辑与'blogpost.get_absolute_url'移动到串行但我宁愿离开逻辑模型。另外,我不是复制粘贴功能的巨大粉丝。 –