【问题标题】:Django Rest Framework Recursive Nested Parent SerializationDjango Rest Framework递归嵌套父序列化
【发布时间】:2016-12-30 11:35:40
【问题描述】:

我有一个模型,它有一个名为 parent 的自引用字段。 型号:

class Zone(BaseModel):
    name = models.CharField(max_length=200)
    parent = models.ForeignKey('self', models.CASCADE, blank=True, null=True, related_name='children')

    def __unicode__(self):
        return self.name

序列化器:

class ZoneSerializer(ModelSerializer):
    parent = PrimaryKeyRelatedField(many=False, queryset=Zone.objects.all())
    parent_disp = StringRelatedField(many=False, source="parent")

    class Meta:
        model = Zone
        fields = ('id', 'name', 'parent', 'parent_disp')

现在我想序列化区域的父级及其父级及其父级,直到父级为无。 我为孩子找到了递归序列化方法,但对父母却没有。 我该怎么做?

【问题讨论】:

    标签: python django recursion serialization django-rest-framework


    【解决方案1】:

    你也可以这样做:

    class ZoneSerializer(ModelSerializer):
        class Meta:
            model = Zone
            fields = ('id', 'name', 'project', 'parent',)
    
        def to_representation(self, instance):
            self.fields['parent'] = ZoneSerializer(read_only=True)
            return super(ZoneSerializer, self).to_representation(instance)
    

    【讨论】:

    • 这对通过相关名称的孩子也很有效
    【解决方案2】:

    好的,我已经做到了。

    class ZoneSerializer(ModelSerializer):
        parent = SerializerMethodField()
    
        class Meta:
            model = Zone
            fields = ('id', 'name', 'project', 'parent',)
    
        def get_parent(self, obj):
            if obj.parent is not None:
                return ZoneSerializer(obj.parent).data
            else:
                return None
    

    【讨论】:

      【解决方案3】:

      在这里尝试使用SerializerMethodField

      def get_parent(self, obj):
          # query what your want here.
      

      我不确定 D-R-F 是否有为此的内置方法,但您可以使用查询在此方法中获取您想要的内容。

      【讨论】:

      • 好吧,但我必须序列化父级。所以我需要一个递归序列化器。
      猜你喜欢
      • 1970-01-01
      • 2018-06-04
      • 2018-02-17
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2017-07-28
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多