2013-09-30 166 views
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領域。你可以說我將它用作只寫字段。 雖然這看起來有點笨重。有沒有更好的方法來做到這一點?

回答

2

確定兩點:

  1. 您是否嘗試過使用PrimaryKeyRelatedFieldoriginal_id?它似乎專門針對您的用例。結合depth option它可能會給你你需要的一切。

  2. 您可以在自己的視圖重寫get_serializer_class()切換串行器(例如,基於請求的方法)。不知道你是否會在這裏得到你想要的確切行爲。

+0

由於我需要輸出原來的鳴叫內聯,而不是簡單的ID,我不認爲'PrimaryKeyRelatedField'是不夠好。如果我理解正確的事情,內聯渲染相關領域是使用另一種串行作爲一個領域做到:http://django-rest-framework.org/api-guide/relations.html#nestedRelationships 'get_serializer_class()'可以工作,如果有一種區分意圖的方法,即序列化或反序列化。我想使用一個序列化程序進行輸入,另一個進行輸出,並且它看起來不像'get_serializer_class()'知道該上下文。 –

+0

是的 - 它不容易支持(至今)。如果是我,我想看看一個自定義的'Field'(可能延長'PrimaryKeyRelatedField'和覆蓋'to_native'拿到的行爲。有[開放拉請求(https://github.com/tomchristie/django- rest-framework/pull/1071)也可以爲你服務。 –

相關問題