Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 动态创建DRF序列化程序类_Django_Django Rest Framework - Fatal编程技术网

Django 动态创建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

我有几个相同模型的DRF序列化程序类。我想将类创建代码移动到函数中,以避免代码重复

因此,基本上我必须从函数返回一个类,但是我无法访问类中的函数参数

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