2015-08-11 1 views
4

Essayer d'accéder au prix d'un produit, l'aide Docs. Mais obtenir une erreur d'attribut.Impossible d'accéder au prix d'un produit dans Django-Oscar?

>>> 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' 

Pour voir tous les attributs de la stratégie que je fais

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

Alors fetch_for_product n'est pas dans les attributs de la stratégie. Maintenant, comment puis-je accéder au prix d'un produit particulier?

+0

fait stratégie a même cette méthode – therealprashant

+0

Regardez les docs, voilà comment ils mentionnent – Coderaemon

+0

comparer votre stratégie avec http://django-oscar.readthedocs.org/en/latest/_modules/oscar/apps/partner /strategy.html#Base.fetch_for_parent – therealprashant

Répondre

7

Ce que vous importez ci-dessus est la stratégie module. Ce que vous voulez, c'est la stratégie objet à la place. La meilleure façon d'obtenir la stratégie est de demander à la stratégie sélecteur pour une:

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 

Le sélecteur est utile car il vous permet d'utiliser différentes stratégies en fonction du contexte (un utilisateur particulier, demande provenant d'un pays particulier, etc.). Dans votre propre boutique vous remplacer le Selector avec votre propre implémentation, par défaut, il retournera le Default strategy.

Voir the docs pour plus d'informations.

+0

Cela fonctionne. Quelle est la différence entre la stratégie et le sélecteur? Pouvez-vous me montrer les docs? – Coderaemon

+0

J'ai mis à jour la réponse pour contenir plus d'informations. – patrys

+0

Y a-t-il quelque chose que vous aimeriez que j'ajoute à la réponse avant de pouvoir l'accepter? – patrys

0

Vous pouvez faire une nouvelle sérialiseur avec champ personnalisé pour charger le produit de la catégorie avec le prix, l'image principale et le titre en utilisant 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 []