调用另一个类下面的一个类

Posted

技术标签:

【中文标题】调用另一个类下面的一个类【英文标题】:calling a class below of another class 【发布时间】:2021-10-15 10:03:12 【问题描述】:

我正在使用 rest_framework 开发一个 django 项目,但我遇到了序列化程序的问题。这是我的代码:

class CategorySerializer(serializers.ModelSerializer):
    featured_product = ProductSerializer(read_only=True)
    class Meta:
        model = Category
        fields = [
            'title',
            'featured_product',
        ]

class ProductSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)
    class Meta:
        model = Product
        fields = [
            'title',
            'price',
            'category',
        ]

如您所见,在ProductSerializer 我使用CategorySerializer,在CategorySerializer 我需要使用ProductSerializer。如果我运行代码,我会得到NameError: name 'ProductSerializer' is not defined第一次尝试:我尝试将它们写入两个不同的文件并将它们导入到两个文件的顶部,但出现Circular Import 错误第二次尝试:我在代码顶部定义了一个名为 ProductSerializer 类的空类,但它不起作用。

【问题讨论】:

在定义了featured_productcategory 之后,您可以将它们分配给它们。 在您的class ProductSerializer 声明之后,只需执行CategorySerializer.featured_product = ProductSerializer(read_only=True) 【参考方案1】:

如果你完成了你正在寻找的东西,它将以无限的序列化进程结束:CategorySerializer -> .featured_product -> ProductSerializer -> .category -> CategorySerializer -> .featured_product - > ProductSerializer -> ...

为避免这种情况,最好创建额外的序列化器,例如:

class ProductListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = [
            'title',
            'price',
        ]


class CategoryListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = [
            'title',
        ]


class CategorySerializer(serializers.ModelSerializer):
    featured_product = ProductListSerializer(read_only=True)

    class Meta:
        model = Category
        fields = [
            'title',
            'featured_product',
        ]


class ProductSerializer(serializers.ModelSerializer):
    category = CategoryListSerializer(read_only=True)

    class Meta:
        model = Product
        fields = [
            'title',
            'price',
            'category',
        ]

但如果你真的想拥有那种循环关系,你可以使用SerializerMethodField来实现,例如:

class CategorySerializer(serializers.ModelSerializer):
    featured_product = serializers.SerializerMethodField()

    class Meta:
        model = Category
        fields = [
            'title',
            'featured_product',
        ]

    def get_featured_product(self, obj):
        return ProductSerializer(obj.featured_product).data


class ProductSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)

    class Meta:
        model = Product
        fields = [
            'title',
            'price',
            'category',
        ]

【讨论】:

以上是关于调用另一个类下面的一个类的主要内容,如果未能解决你的问题,请参考以下文章

Java中同一个类下一个方法怎样访问另一个方法下的变量

log4J指定类下面的日志分隔

C#winform中为啥一个窗体的对象可以调用在另一个窗体中创建的一个类未实例化下

sql 查询:无限极分类,获取父类下所有子类

python下把A类当参数传给B类下面方法,怎么可以获取A类下的方法返回值呢

类,对象 ,封装,实例变量,类变量,继承,多态