Django 动态创建DRF序列化程序类
我有几个相同模型的DRF序列化程序类。我想将类创建代码移动到函数中,以避免代码重复 因此,基本上我必须从函数返回一个类,但是我无法访问类中的函数参数Django 动态创建DRF序列化程序类,django,django-rest-framework,Django,Django Rest Framework,我有几个相同模型的DRF序列化程序类。我想将类创建代码移动到函数中,以避免代码重复 因此,基本上我必须从函数返回一个类,但是我无法访问类中的函数参数 def get_course_serializer(fields, read_only_fields=None): class CourseSerializer(serializers.ModelSerializer): if "id" in fields: id = serial
def get_course_serializer(fields, read_only_fields=None):
class CourseSerializer(serializers.ModelSerializer):
if "id" in fields:
id = serializers.CharField(default="", read_only=True)
class Meta:
model = Course
fields = fields
if read_only_fields:
read_only_fields = read_only_fields
return CourseSerializer
此处,字段在课程序列化程序类定义中不可访问。我尝试使用全局关键字,但没有成功
我计划如下使用此功能
CourseListSerializer = get_course_serializer(
["id", "title", "slug", "description"])
您可以使用
type
动态创建类,类似这样的方法应该可以工作(未测试):
您可以使用
type
动态创建类,类似这样的方法应该可以工作(未测试):
非本地
而不是全局
有效吗?如果没有,您可能必须使用类型的3参数形式
,我建议您仔细阅读,您将无法访问类定义中的字段
。但是您可以使用类型
(参见文档)动态创建类定义。非本地也不起作用。对于使用类型
,我必须提供方法定义和属性,因此基本上我必须提供类型
所需的所有字段。所以会有很多代码重复,但是你也需要在你的方法中这样做,或者我遗漏了什么?您总是需要定义属性和类方法吗?我已经使用类型方法发布了一个答案。您也可以使用类型
,但在这种情况下使用它没有任何好处。非本地
是否可以代替全局
?如果没有,您可能必须使用类型的3参数形式
,我建议您仔细阅读,您将无法访问类定义中的字段
。但是您可以使用类型
(参见文档)动态创建类定义。非本地也不起作用。对于使用类型
,我必须提供方法定义和属性,因此基本上我必须提供类型
所需的所有字段。所以会有很多代码重复,但是你也需要在你的方法中这样做,或者我遗漏了什么?您总是需要定义属性和类方法吗?我已经使用类型方法发布了一个答案。您也可以使用类型
,但在这种情况下使用它没有任何好处。我认为您还需要动态创建元类并将其传递给mappingYes,包括编辑中的测试代码。非常感谢,yvesonline!!这种方法是可行的,但这是最好的方法,还是有更好的方法动态创建类?我想您也需要动态创建元类,并将其传递给mappingYes,包括编辑中的测试代码。非常感谢,yvesonline!!这种方法是可行的,但这是最好的方法,还是有更好的方法动态创建类?
def get_course_serializer(fields, read_only_fields=None):
mapping = {}
if "id" in fields:
mapping["id"] = serializers.CharField(default="", read_only=True)
...
CourseSerializer = type("CourseSerializer", (serializers.ModelSerializer, ), mapping)
return CourseSerializer