gpt4 book ai didi

python - 奇怪的 ModelViewSet 行为

转载 作者:行者123 更新时间:2023-11-28 18:34:59 25 4
gpt4 key购买 nike

我正在尝试使用 DRF 序列化 MPTT 树模型。

我的代码:

class SiteTreeCalc(serializers.Field):
def to_representation(self, value):
return value.exists() # return True if has children, False otherwise

class SiteTreeSerializer(serializers.ModelSerializer):
children = SiteTreeCalc()
class Meta:
model = SiteTree
fields = ('id', 'site', 'children')
depth = 1

class SiteTreeViewSet(viewsets.ModelViewSet):
#queryset = SiteTree.objects.all()
serializer_class = SiteTreeSerializer

def get_queryset(self):
if 'pk' not in self.kwargs:
# return first-level nodes
return SiteTree.objects.filter(level=0)
else:
# return all children of a given node
return SiteTree.objects.filter(parent__id=int(self.kwargs['pk']))


router = routers.DefaultRouter()
router.register(r'rest/sitetree', SiteTreeViewSet, "SiteTreeRoots")
router.register(r'rest/sitetree/(?P<tree_id>\d+)/$', SiteTreeViewSet, "SiteTreeChildren")

这段代码有两个问题:

  1. 我在路由器注册中声明了参数“tree_id”。但是,get_queryset 表示参数名称是 pk
  2. 第二个过滤器从不工作(应该返回给定父项的子项的那个)。 DRF 返回“详细信息”:“未找到”。如果我在调试器中测试该行,它自然会返回给定父项的所有子项。

我似乎做错了什么,但代码对我来说太明显了,以至于我看不到它。

帮助 - 一如既往 - 非常感谢。

最佳答案

原来,我一有机会就想忘记 DefaultRouter 的便利功能。

问题是我想像创建任何其他可写 ViewSet 一样创建 ViewSet,但这个特定的 ViewSet 仅用于检索项目。至少,那是我的意图。但 DRF 不知道这一点,所以 我的问题 #2 是 DRF 实际上检查我返回的 PK 与 URL 中给出的完全相同的一项的结果。

一个有效的解决方案是这样的(建议 in the DRF ViewSets documentation ):

class SiteTreeViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SiteTree.objects.filter(level=0)
serializer_class = SiteTreeSerializer

@detail_route()
def children(self, request, pk=None):
data = SiteTree.objects.filter(parent__id=int(pk))
data = self.get_serializer(data, many=True)
return Response(data.data)

此解决方案以默认模式返回第一级项目,并且还接受 /{pk}/children 以返回给定 pk 节点的子项。当然,当提供 /{pk}/ URL 时,默认操作仍将仅返回 pk 节点。

路由器注册仅保留默认注册:

router.register(r'rest/sitetree', SiteTreeViewSet)

关于python - 奇怪的 ModelViewSet 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33438495/

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