如何在DRF序列化程序中使用自引用递归字段进行筛选

2024-09-29 17:20:25 发布

您现在位置:Python中文网/ 问答频道 /正文

使用python3.x和Django Rest框架。我有一个带有Recursive Field(self)的序列化程序,它按预期工作。但是,我需要一种方法来最初过滤由active = True返回的嵌套子元素。在

我尝试过用不同的方法按active=True来筛选子级,但我无法在序列化程序中返回的嵌套子级上使用此方法。在

这是我所拥有的。

class MenuListSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name='menu_detail')
    children = RecursiveField(many=True, required=False)


class RecursiveField(serializers.Serializer):
    """
    Self-referential field for MPTT.
    """
    def to_representation(self, value):
        serializer = self.parent.parent.__class__(value, context=self.context)
        return serializer.data

这是我尝试过的,但得到的错误是ListSerializer'对象没有属性'queryset'但是,我甚至不确定这是否有效。在

^{pr2}$

Tags: 方法self程序true序列化valuecontextpython3
1条回答
网友
1楼 · 发布于 2024-09-29 17:20:25

如果我理解得很好,您正在尝试以分层方式序列化Menu对象。 要做到这一点,我想您递归地序列化您的顶层菜单对象,不是吗?(否则您将在顶层获得所有菜单对象)。在

为了能够仅筛选活动子级,我建议在您的模型上创建一个active_children属性:

class Menu(MPTTModel, TimeStampedModel):
    name = models.CharField(max_length=100)
    active = models.BooleanField(default=1)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')

    @property
    def active_children(self):
        return self.children.filter(active=True)

然后可以将其用作序列化程序中children字段的源:

^{pr2}$

现在序列化时应该只有活动的子对象。在

注意,您还应该过滤查询集中的顶级对象,因为上面的筛选只适用于Menu对象中的子对象。在

相关问题 更多 >

    热门问题