我继承了一些Django代码,我正在努力弄清楚以前的开发人员对他们的代码的意图。
有一个配置的ViewSet,它继承自GenericViewSet。在类中,它定义了queryset
变量,但也定义了get_queryset
方法。我正在努力从文档和教程中解决这个甚至意味着什么?更有趣的是get_queryset
方法返回一种类型的查询集,但queryset
变量定义了不同的类型。
我希望将两个查询集合并在一起(这是期望的行为,并且似乎发生在一台服务器上,而不是另一台服务器上,因此需要进行一些额外的调查以找出原因)< / p>
以下代码:
class FeedbackFieldViewSet(NestedViewSetMixin,
customer_mixins.CustomerProviderMixin,
mixins.ListModelMixin,
viewsets.GenericViewSet):
##
# Instantiates and returns the list of permissions required by this viewset.
#
# @return The list of permissions.
#
def get_permissions(self):
# Maps action names to tuples of permission classes.
permissionDict = {
"list": self.listPermissionClasses,
}
if self.action in permissionDict:
return [permission() for permission in permissionDict[self.action]]
if self.request.method == "OPTIONS":
# Anyone can submit an options request
return []
raise ProgrammingException("A request with an unknown permission model was received.")
listPermissionClasses = (IsFeatureEnabled,)
##
# Overrides the get_queryset method to join the custom feedback fields
# with the default feedback fields.
#
def get_queryset(self):
queryset = super(FeedbackFieldViewSet, self).get_queryset().filter(
deleted = False,
recordContentType = ContentType.objects.get(
app_label = "hubpro_api",
model = "feedback"))
return list(chain(queryset, FeedbackField.objects.all()))
serializer_class = FeedbackFieldSerializer
feature = "feedback"
queryset = CustomField.objects.all()
答案 0 :(得分:5)
get_queryset
和self.queryset
有不同的用途,例如self.queryset
的定义用于确定路由器URL定义中视图的基本名称(请参阅注释:http://www.django-rest-framework.org/api-guide/routers/#usage)如果您不提供查询集作为视图的属性DRF将引发路由器出错。
在您的具体情况下(根据您的源代码段显示),queryset
,没有用,如果它没有在其他任何地方使用(根据此代码段无法确定)!强>
我对重构以减轻可读性和清除内容的建议是在查询集中为get_queryset
方法中使用的过滤器创建自定义方法,我会完全删除queryset
(如果它的安全性取决于你的代码的其余部分),因为下一个编码器需要像你理解它一样挖掘代码。
编码大约80%读取20%编码并且总是让代码比你发现的更好(〜清洁代码,robert c.martin)。
答案 1 :(得分:2)
视图集中get_queryset
方法正在做的事情的主旨是
def get_queryset(self):
return self.queryset
由于您已覆盖get_queryset
方法并致电super
,因此您正在改变结果。
答案 2 :(得分:1)
这可能对其他人没用,但为了完整性我正在回答它。
确实queryset
和get_queryset
查询集合在一起。看起来get_queryset
对super(FeedbackFieldViewSet, self).get_queryset()
的调用获取了查询集值(CustomField.objects.all()
),然后list(chain(queryset, FeedBackField,objects.all()))
组合了两个查询集。
我的错误与分页有关,即丢失的值丢失了,因为它们不在结果的第一页上。