Вызов класса, находящегося ниже другого класса
Я работаю над проектом django с rest_framework и у меня возникла проблема с сериализаторами. Вот мой код:
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
класс в верхней части моего кода, но это не сработало.
Если вы достигнете искомого, это закончится бесконечным процессом сериализатора: 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',
]