首页 > 解决方案 > 如何将不同的输入传递给类函数

问题描述

我在 Django 休息框架中有两个不同的类,它们做完全相同的事情但使用不同的数据。只能在特定函数内访问该数据变量。目前我已经明确编写了两个单独的类。我怎样才能将它合并到一个类中并通过传递一个单独的参数来继承它。

from rest_framework import permissions
class CreateOrUpdateInSameSchool1(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in ('POST', 'PUT','PATCH'):
            return self.request.user.school.id == obj.xyz.school.id  # Different !!
        else:
            return True

class CreateOrUpdateInSameSchool2(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in ('POST', 'PUT','PATCH'):
            return self.request.user.school.id == obj.mno.school.id  # Different !!
        else:
            return True

obj变量仅在函数内部可用has_object_permission

标签: pythondjango-rest-framework

解决方案


你想做这样的事情吗?我知道它很丑,但可能会改进:

from rest_framework import permissions
class CreateOrUpdateInSameSchool(permissions.BasePermission):
    def __init__(self, school_id_type):
        self.school_id_type = school_id_type
    def has_object_permission(self, request, view, obj):
        if request.method in ('POST', 'PUT','PATCH'):
            if self.school_id_type == "xyz":
                return self.request.user.school.id == obj.xyz.school.id  # Different !!
            elif self.school_id_type == "mno":
                return self.request.user.school.id == obj.mno.school.id  # Different !!
            else:
                return None
        else:
            return True

或者您可以使用operator.attrgetter()

from rest_framework import permissions
from operator import attrgetter

class CreateOrUpdateInSameSchool(permissions.BasePermission):
    def __init__(self, school_id_type: str):
        self.school_id_type = school_id_type
    def has_object_permission(self, request, view, obj):
        s_id_type = attrgetter(self.school_id_type, 'school', 'id')(obj)
        if request.method in ('POST', 'PUT','PATCH'):
            return self.request.user.school.id == s_id_type  # Different !!
        else:
            return True

两种方式,当你像这样调用类时,你需要指定你想要什么样的返回对象:

foo = CreateOrUpdateInSameSchool(school_id_type='xyz')
# or
bar = CreateOrUpdateInSameSchool(school_id_type='mno')

推荐阅读