5

尝试访问产品的价格,使用文档。但得到属性错误。

>>> from oscar.apps.partner import strategy, prices
>>> from oscar.apps.catalogue.models import *
>>> product = Product.objects.get(pk=1)
>>> info = strategy.fetch_for_product(product)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'fetch_for_product'

要查看我所做的策略的所有属性

  >>> dir(strategy)
  >>> ['Base', 'D', 'Default', 'DeferredTax', 'FixedRateTax', 'NoTax', 'PurchaseInfo', 
    'Selector', 'StockRequired', 'Structured', 'UK', 'US', 'UseFirstStockRecord', 
'__builtins__', '__doc__', '__file__', '__name__',
 '__package__', 'availability', 'namedtuple', 'prices']

所以 fetch_for_product 不在策略属性中。现在我如何访问特定产品的价格?

4

2 回答 2

9

您在上面导入的是策略模块。你想要的是策略对象。获取策略的最简单方法是向策略选择器询问一个:

from oscar.apps.partner.strategy import Selector

selector = Selector()
strategy = selector.strategy(request=..., user=...)
purchase_info = strategy.fetch_for_product(product=...)
price = purchase_info.price

选择器很有用,因为它允许您根据上下文(特定用户、来自特定国家的请求等)使用不同的策略。在您自己的商店中,您可以Selector使用自己的实现覆盖 ,默认情况下它将返回Defaultstrategy

有关更多信息,请参阅文档

于 2015-08-11T10:53:39.753 回答
1

您可以使用自定义字段创建一个新的序列化程序,以使用SerializeMethodField加载具有价格、主图像和标题的类别产品。

from rest_framework import serializers

from oscar.apps.partner.strategy import Selector

class ProductsSerializer(serializers.ModelSerializer):
    price = serializers.SerializerMethodField()
    availability = serializers.SerializerMethodField()
    images = serializers.SerializerMethodField()

    class Meta:
        model = Product
        fields= ('id', 'title','availability', 'images', 'price',)

    def get_price(self, obj):
        strategy = Selector().strategy()
        price = vars(strategy.fetch_for_product(obj).price)
        price['final'] = price['excl_tax'] + price['tax']
        return price

    def get_availability(self, obj):
        strategy = Selector().strategy()
        availability = vars(strategy.fetch_for_product(obj).availability)
        try:
            return availability['num_available']
        except KeyError:
            return -1

    def get_images(self, obj):
        try:
            return ['https://127.0.0.1:8000/'+str(obj.primary_image().original)]
        except AttributeError:
            return []
于 2017-12-10T13:42:45.940 回答