gpt4 book ai didi

python - 如何使用自引用递归字段在 DRF 串行器中进行过滤

转载 作者:行者123 更新时间:2023-12-01 02:35:52 30 4
gpt4 key购买 nike

使用 Python 3.x 和 Django Rest 框架。我有一个带有 Recursive Field (on 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' object has no attribute 'queryset' 但是,我什至不确定这是否有效。

class MenuListSerializer(serializers.ModelSerializer):

def __init__(self, *args, request_user=None, **kwargs):
# try and filter active in chrildrend before query set is passed
super(MenuListSerializer, self).__init__(*args, **kwargs)
# print(self.fields['children'].parent)
self.fields['children'].queryset = self.fields['children'].queryset.filter(active=True)

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

最佳答案

如果我理解得很好,您正在尝试以分层方式序列化 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 字段的来源:

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

现在,序列化时应该只有事件的子级。

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

关于python - 如何使用自引用递归字段在 DRF 串行器中进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46235235/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com