1
/解串我有一個遞歸關係模型本身:不同的序列化序列化使用Django的REST框架
class Tweet(models.Model):
text = models.CharField(max_length=140)
original = models.ForeignKey("self", null=True, blank=True)
這使得原有的在線分享Tweet串行:
class TweetSerializer(serializers.ModelSerializer):
class Meta:
model = Tweet
fields = ('id', 'text', 'original', 'original_id')
original_id = serializers.IntegerField(source='original_id', required=False)
def to_native(self, obj):
ret = super(TweetSerializer, self).to_native(obj)
del ret['original_id']
return ret
TweetSerializer.base_fields['original'] = TweetSerializer(source='original', read_only=True)
正如你所看到的,我還有一個在to_native
中刪除的original_id字段。的original_id
的目的是爲了讓我樹立了新的鳴叫original_id,而不是提供一個完全成熟的特威德對象到original
領域。你可以說我將它用作只寫字段。 雖然這看起來有點笨重。有沒有更好的方法來做到這一點?
由於我需要輸出原來的鳴叫內聯,而不是簡單的ID,我不認爲'PrimaryKeyRelatedField'是不夠好。如果我理解正確的事情,內聯渲染相關領域是使用另一種串行作爲一個領域做到:http://django-rest-framework.org/api-guide/relations.html#nestedRelationships 'get_serializer_class()'可以工作,如果有一種區分意圖的方法,即序列化或反序列化。我想使用一個序列化程序進行輸入,另一個進行輸出,並且它看起來不像'get_serializer_class()'知道該上下文。 –
是的 - 它不容易支持(至今)。如果是我,我想看看一個自定義的'Field'(可能延長'PrimaryKeyRelatedField'和覆蓋'to_native'拿到的行爲。有[開放拉請求(https://github.com/tomchristie/django- rest-framework/pull/1071)也可以爲你服務。 –