比方說,我有這個簡單的模型:型號串行:選擇要顯示的字段,並添加自定義字段
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'移動到串行但我寧願離開邏輯模型。另外,我不是複製粘貼功能的巨大粉絲。 –