【问题标题】:Python similar method in multiple classes多个类中的Python类似方法
【发布时间】:2017-11-29 13:12:24
【问题描述】:

我正在尝试重构我的 Django 应用程序。这是我发现烦人的重复代码:

class EducationInfoViewSet(viewsets.ModelViewSet):

    queryset = pf.education_info.objects.all()
    serializer_class = EducationInfoSerializer
    permission_classes = (VisionUserPermissions, )

    def get_queryset(self):

        model = pf.education_info

        identity = self.request.query_params.get('username',None)
        queryset = model.objects.all()
        user = User.objects.none()
        if identity is not None:
            user = User.objects.get(username=identity)
            student = get_object_or_404(dbd.user_type, username=user)        
            queryset = model.objects.filter(username=student)
        if not permission_check(self.request,user):
            return User.objects.none()
        return queryset


class FamilyInfoViewSet(viewsets.ModelViewSet):

    queryset = pf.family_info.objects.all()
    serializer_class = FamilyInfoSerializer
    permission_classes = (VisionUserPermissions, )

    def get_queryset(self):

        model = pf.family_info

        identity = self.request.query_params.get('username',None)
        queryset = model.objects.all()
        user = User.objects.none()
        if identity is not None:
            user = User.objects.get(username=identity)
            student = get_object_or_404(dbd.user_type, username=user)        
            queryset = model.objects.filter(username=student)
        if not permission_check(self.request,user):
            return User.objects.none()
        return queryset

所以我的“get_queryset”函数除了一个变量之外是相同的,而且我有多个像这两个这样的类。我应该如何在不重复自己的情况下实现这一点?

提前致谢!

【问题讨论】:

  • 请阅读article关于python中的继承
  • 创建一个包含所有常用方法的 InfoViewSet 类。然后创建 Family 和 Education 类,让它们从 InfoViewSet 继承,并且只实现不同的方法。
  • 感谢您的文章和整个想法!我没有意识到类继承可以如此灵活。

标签: python django class django-rest-framework multiple-inheritance


【解决方案1】:

创建一个混合类

class QuerysetMixin(viewsets.ModelViewSet):

    def get_queryset(self):

        model = getattr(pf, self.field_name)

        identity = self.request.query_params.get('username',None)
        queryset = model.objects.all()
        user = User.objects.none()
        if identity is not None:
            user = User.objects.get(username=identity)
            student = get_object_or_404(dbd.user_type, username=user)        
            queryset = model.objects.filter(username=student)
        if not permission_check(self.request,user):
            return User.objects.none()
        return queryset

并继承它

class FamilyInfoViewSet(viewsets.ModelViewSet, QuerysetMixin):

    queryset = pf.family_info.objects.all()
    serializer_class = FamilyInfoSerializer
    permission_classes = (VisionUserPermissions, )
    field_name = 'family_info'

【讨论】:

  • 您的意思可能是“mixin”而不是“mixing”。
  • 设置“field_name”正是我没有想到的聪明方法!!非常感谢。顺便说一句,“QuerysetMixing”不应该是唯一的参数吗?我看不出“FamilyInfoViewSet”有两个参数的意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 2011-06-19
  • 2020-03-29
  • 2022-01-19
  • 2012-09-05
相关资源
最近更新 更多