如何覆盖oscar api ChildProductserializer 。 我遵循了oscar api指南如何覆盖序列化程序,但是我无法覆盖此序列化程序
Oscar api儿童序列化器
class ChildProductserializer(PublicProductSerializer):
"Serializer for child products"
parent = serializers.HyperlinkedRelatedField(
view_name="product-detail",
queryset=Product.objects.filter(structure=Product.PARENT),
)
# the below fields can be filled from the parent product if enabled.
images = ProductImageSerializer(many=True, required=False, source="parent.images")
description = serializers.CharField(source="parent.description")
class Meta(PublicProductSerializer.Meta):
fields = overridable(
"OSCARAPI_CHILDPRODUCTDETAIL_FIELDS",
default=(
"url",
"upc",
"id",
"title",
"structure",
# 'parent', 'description', 'images', are not included by default, but
# easily enabled by overriding OSCARAPI_CHILDPRODUCTDETAIL_FIELDS
# in your settings file
"date_created",
"date_updated",
"recommended_products",
"attributes",
"categories",
"product_class",
"price",
"availability",
"options",
),
)
我的覆盖子序列化器
class ChildProductSerializer(product.ChildProductserializer):
price = serializers.SerializerMethodField()
availability = serializers.SerializerMethodField()
class Meta(product.ChildProductserializer.Meta):
fields=('url','parent','price','availability')
# 'price','availability','parent')
def get_price(self, instance):
request = self.context.get("request")
strategy = Selector().strategy(request=request, user=request.user)
ser = checkout.PriceSerializer(
strategy.fetch_for_product(instance).price,
context={'request': request})
return ser.data
def get_availability(self,instance):
request = self.context.get("request")
strategy = Selector().strategy(request=request, user=request.user)
ser = product.AvailabilitySerializer(
strategy.fetch_for_product(instance).availability,
context={'request': request}
)
return ser.data
class ProductLinkSerializer(product.ProductLinkSerializer):
price = serializers.SerializerMethodField()
availability = serializers.SerializerMethodField()
class Meta(product.ProductLinkSerializer.Meta):
fields = ('url','children')
# ,'id','children','price','title','images','description','children','structure','availability')
def get_price(self, instance):
request = self.context.get("request")
strategy = Selector().strategy(request=request, user=request.user)
ser = checkout.PriceSerializer(
strategy.fetch_for_product(instance).price,
context={'request': request})
return ser.data
def get_availability(self,instance):
request = self.context.get("request")
strategy = Selector().strategy(request=request, user=request.user)
ser = product.AvailabilitySerializer(
strategy.fetch_for_product(instance).availability,
context={'request': request}
)
return ser.data
,但即使Meta字段也不起作用,并且api显示默认字段 我只有一个序列化程序有问题,因为在同一文件中覆盖ProductLinkSerializer和OptionSerializer可以正常工作。
答案 0 :(得分:0)
因为您的问题还不清楚,所以在这里走开,我假设您的意思是meta字段未按预期显示,并且您仅看到默认字段。
基本上,由于您要继承ChildProductserializer,因此建议您也应添加此序列化器中的字段。
class Meta(product.ChildProductserializer.Meta):
fields= product.ChildProductserializer.Meta + ('url','parent','price','availability')
这样,您将覆盖这些字段。请记住,您要覆盖而不是覆盖