调用另一个类下面的一个类
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_product
和category
之后,您可以将它们分配给它们。
在您的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',
]
【讨论】:
以上是关于调用另一个类下面的一个类的主要内容,如果未能解决你的问题,请参考以下文章
C#winform中为啥一个窗体的对象可以调用在另一个窗体中创建的一个类未实例化下