我正在尝试创建一个相关产品字段,我已在模型中添加了具有多对多关系的字段,并将其设置为self,因为我将手动选择相关产品。
class ProductsSerializer(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
color = ColorSerializer(many=False)
class Meta:
fields = (
'url',
'id',
"code",
"sku",
"title",
"slug",
"state",
"old_price",
"price",
"valid",
"in_stock",
"category",
"related_products",
"color",
"images",
"video",
"description",
"fabric",
"model_size_info",
)
model = Products
我无法引用相同的序列化程序,我需要在api json中获取产品详细信息。我找不到办法。
谢谢您的帮助。
答案 0 :(得分:1)
方法1::覆盖 __init__()
方法
class ProductsSerializer_Temp(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
class Meta:
fields = (
'url',
'id',
"title",
"images",
)
model = Products
class ProductsSerializer(ProductsSerializer_Temp):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields.update(
{"related_products": ProductsSerializer_Temp()}
)
答案 1 :(得分:0)
首先,我认为您应使用DynamicFieldsModelSerializer之类的东西来防止递归
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
然后,您可以使用SerializerMethodField
并在相关产品中指定所需的字段(“请勿传递related_products
以防止递归”):
class ProductsSerializer(DynamicFieldsModelSerializer):
images = ImagesSerializer(many=True)
related_products = serializers.SerializerMethodField()
def get_related_products(self, obj):
return ProductsSerializer(obj.related_products, many=True, fields=('url', 'id', "title", "images")).data
class Meta:
fields = (
'url',
'id',
"title",
"related_products",
"images",
)
model = Products
答案 2 :(得分:0)
这是我遇到的解决方案。 我创建了另一个序列化器
class ProductsSerializerTemp(serializers.ModelSerializer):
color = ColorSerializer(many=False)
class Meta:
fields = (
"color",
"url"
)
model = Products
然后我将其转给我的原始序列化器
class ProductsSerializer(serializers.ModelSerializer):
images = ImagesSerializer(many=True)
color = ColorSerializer(many=False)
related_products = ProductsSerializerTemp(many=True)
class Meta:
fields = (
'url',
'id',
"code",
"sku",
"title",
"slug",
"state",
"old_price",
"price",
"valid",
"in_stock",
"category",
"related_products",
"color",
"images",
"video",
"description",
"fabric",
"model_size_info",
)
model = Products
我几乎完成了这项工作,我不确定这是否是最好的解决方案,但是效果很好。