在另一个 class 下面调用 class
calling a class below of another class
我正在使用 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
错误
第二次尝试:
我定义了一个空的 class,名称为 ProductSerializer
class我代码的顶部,但没有用。
如果你完成了你正在寻找的东西,它将以无限序列化程序进程结束: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',
]
我正在使用 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
错误
第二次尝试:
我定义了一个空的 class,名称为 ProductSerializer
class我代码的顶部,但没有用。
如果你完成了你正在寻找的东西,它将以无限序列化程序进程结束: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',
]