2016-01-05 10 views
6

Desidero accedere all'oggetto richiesta nel mio Views.py e Serializers.py in DRF. mio Views.py:Accesso all'oggetto richiesta in serie viste e serializzatori in Django Rest Framework?

class ProductViewSet(viewsets.ReadOnlyModelViewSet): 

    """ 
    This viewset automatically provides `list` and `detail` actions. 
    """ 
    queryset = Product.objects.all() 
    serializer_class = ProductSerializer(context={'request': request}) 

mio Serializers.py:

class ProductSerializer(serializers.HyperlinkedModelSerializer): 

    get_sr_price = serializers.SerializerMethodField('get_sr_price_func') 

    def get_sr_price_func(self, obj): 
     return self.request.user ?? 

    class Meta: 
     model = Product 
     fields = (
      'title', 'slug', 'product_stores', 'get_sr_price') 

In Serializers.py ottengo ProductSerializer' object has no attribute 'request'. Inoltre in Views.py ottengo NameError: name 'request' is not defined

Come si accede all'oggetto richiesta? Devo passarlo dalle visualizzazioni ai serializzatori? Qual è la differenza tra views.py e serializers.py? Generalmente scrivo tutta la logica aziendale in Views.py; anche qui dovrei fare tutte le query/filtri nelle viste o dovrei farle nei serializzatori o non fa differenza. Nuovo a DRF, per favore aiuto.

+1

DRF include 'oggetto request' di default nel contesto. Usa 'self.context ['richiesta']. Utente'. –

+0

Questo funziona. Aggiungilo come una risposta accetterà. – Coderaemon

risposta

15

Non è necessario includere l'oggetto request nel contesto in quanto le viste generiche passano l'oggetto request al contesto serializzatore.

DRF frammento di codice sorgente:

# rest_framework/generics.py 
def get_serializer_context(self): 
    """ 
    Extra context provided to the serializer class. 
    """ 
    return { 
     'request': self.request, # request object is passed here 
     'format': self.format_kwarg, 
     'view': self 
    } 

Nel vostro serializzatore, è possibile access l'oggetto request mediante l'attributo .context.

The context dictionary can be used within any serializer field logic, such as a custom .to_representation() method, by accessing the self.context attribute.

class ProductSerializer(serializers.HyperlinkedModelSerializer): 

    get_sr_price = serializers.SerializerMethodField('get_sr_price_func') 

    def get_sr_price_func(self, obj): 
     return self.context['request'].user # access the request object 
1

I serializzatori sono il modo in cui i dati esterni sono mappati da/a modelli (classi Django o semplici Python).

Le viste riguardano il modo in cui verranno visualizzati i dati. Limitazione, impaginazione, autenticazione sono gestite dalla vista. Gestiscono anche il set di dati.

DRF fornisce un context per passare i dati specifici della richiesta al serializzatore senza dover ridefinire init. Questo è probabilmente quello che stai cercando.

+0

Tentativo di passare il contesto dalle viste 'serializer_class = ProductSerializer (context = {'request': request})' dice 'NameError: name 'request' non è definito' – Coderaemon

+1

serializer_class dovrebbe essere una classe, non un'istanza. – Linovia

+0

Si dovrebbe ignorare della vista 'get_serializer_context' – Linovia