Django Oscar API覆盖子序列化器

时间:2020-05-26 22:24:49

标签: django serialization django-oscar

如何覆盖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可以正常工作。

1 个答案:

答案 0 :(得分:0)

因为您的问题还不清楚,所以在这里走开,我假设您的意思是meta字段未按预期显示,并且您仅看到默认字段。

基本上,由于您要继承ChildProductserializer,因此建议您也应添加此序列化器中的字段。

class Meta(product.ChildProductserializer.Meta):
    fields= product.ChildProductserializer.Meta + ('url','parent','price','availability')

这样,您将覆盖这些字段。请记住,您要覆盖而不是覆盖