【问题标题】:Django oscar api overwrite child serializerDjango oscar api 覆盖子序列化程序
【发布时间】:2020-05-26 22:24:49
【问题描述】:

如何覆盖 oscar apiChildProductserializer。 我遵循了 oscar api guide 如何覆盖序列化程序,但我无法覆盖这个序列化程序

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

但即使元字段也不起作用,api 显示默认字段 我对这个序列化程序只有一个问题,因为在同一个文件中覆盖 ProductLinkSerializer 和 OptionSerializer 工作正常。

【问题讨论】:

    标签: django serialization django-oscar


    【解决方案1】:

    因为你的问题不是很清楚,所以我假设你的意思是元字段没有按预期显示,你只看到默认字段。

    基本上,由于您继承的是 ChildProductserializer,我建议您也应该添加来自该序列化器的字段。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-09
      • 2017-04-09
      • 2023-03-17
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      相关资源
      最近更新 更多