2014-10-06 111 views
2

假設我有這樣一個模型:嵌套領域Django的REST框架

class Case(models.Model): 
    opened = models.DateTimeField(auto_now_add=True) 
    client_first_name = models.CharField(max_length=50) 
    client_last_name = models.CharField(max_length=50) 

我想組client_*領域,使序列化JSON是這樣的:

{ 
    "opened": "2014-10-05T19:30:48.667Z", 
    "client": { 
     "first_name": "John", 
     "last_name": "Doe" 
    } 
} 

我嘗試以下,但不起作用,因爲client不是一個實際的領域:

class ClientSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Case 
     fields = ('client_first_name', 'client_last_name') 


class CaseSerializer(serializers.ModelSerializer): 
    client = ClientSerializer() 

    class Meta: 
     model = Case 
     fields = ('opened', 'client') 

除了完全手動序列化之外,我還有哪些選項?我不想爲Client製作單獨的模型,因爲這些數據確實屬於Case。只讀不夠好。

+0

有一個答案。 http://stackoverflow.com/questions/28187476/django-rest-framework-how-to-nest-several-fields-in-a- serializer。 – brawaga 2016-09-20 07:44:39

+0

@brawaga這不是一個真正的答案,因爲它是「完全手動序列化」,我寫了我正在尋找除此之外的其他選項。不管怎麼說,還是要謝謝你;很好有作者的意見。 – 2016-09-20 11:00:55

+0

@Dien,根據沒有答案,但在底部的頂部帖子更新,你可以建立一個解決方案不違反DRY,這不會是完全的,而是半人工序列化,只是因爲解決方案是操縱validated_data和實例和可能更多。它會雙向工作。 – brawaga 2016-09-21 07:50:17

回答

1

你可以嘗試這樣的:

class CaseSerializer(serializers.ModelSerializer): 
    client = serializers.SerializerMethodField('client') 

    class Meta: 
     model = Case 
     fields = ('opened', 'client') 

    def client(self, obj): 
     client_fields = {} 
     client_fields['first_name'] = obj.client_first_name 
     client_fields['last_name'] = obj.client_last_name 
     return client_fields 
+0

它沒有工作,但我明白了。不幸的是,它本質上是隻讀的,我需要全面的CRUD支持。 – 2014-10-06 14:55:36

+0

Dooh!我忘了。是的,SerializerMethodField是隻讀的。我已經大量使用它,但對於只讀的Web服務,所以我沒有立即想到您還需要發佈和放置方法。 – cezar 2014-10-06 15:24:42

+0

@ThijsvanDien我認爲它可以使用自定義保存方法? – Pureferret 2015-02-16 11:44:04