2014-10-06 97 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

相关问题