2014-12-28 29 views
0

考慮以下型號:串行的蒙戈車型排除特定相關的類類型

class Line(Document): 
    name = StringField() 

class Root(Document): 
    name = StringField() 
    children = ListField(fields=ReferenceField('RootContent')) 

class RootContent(Document): 
    meta = { 'allow_inheritance': True } 

class Directory(RootContent): 
    name = StringField() 
    children = ListField(fields=ReferenceField('RootContent')) 

class File(RootContent): 
    name = StringField() 
    children = ListField(fields=ReferenceField('Line')) 

我需要串行使用Django,其餘的框架,mongoengine可以爲我提供具有所有目錄和文件中的所有根源,但不是線條。我可能會設定一個相當大的「深度」值。我該如何編寫一個序列化程序呢?

回答

0

最後,我終於實現了類似以下內容:

from rest_framework_mongoengine import serializers as mongo_serializers 

class ChildField(mongo_serializers.serializers.Serializer): 
    def to_native(self, value): 
     return self.parent.to_native(value) 

class TreeSerializer(mongo_serializers.MongoEngineModelSerializer): 
    name = mongo_serializers.fields.SerializerMethodField(method_name='get_name') 
    children = ChildField(many=True) 

    class Meta: 
     model = Root 

    def get_name(self, obj): 
     """Mainly in to nullify children of 
     object""" 
     if isinstance(obj, File): 
      obj.children = [] 
     return obj.name