2016-01-05 4 views
6

Ich möchte auf das Anfrageobjekt in meiner Sichten.py und Serializers.py in DRF zugreifen. Mein Views.py:Zugreifen auf Request-Objekt in Viewset und Serializer 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}) 

Mein 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 bekomme ich ProductSerializer' object has no attribute 'request'. Auch in views.py bekomme ich NameError: name 'request' is not defined

Wie kann ich Anfrage Objekt zugreifen? Muss ich es von Ansichten zu Serialisierer übergeben? Was ist der Unterschied zwischen views.py und serializers.py? Generell schreibe ich die gesamte Geschäftslogik in Views.py; hier sollte ich auch alle Abfragen/Filter in den Ansichten tun oder sollte ich sie in Serialisierer tun, oder es macht keinen Unterschied. Neu bei DRF bitte hilfe.

+1

DRF umfasst 'request' Objekt standardmäßig im Kontext. Verwende 'self.context ['request']. User'. –

+0

Das funktioniert. Fügen Sie es hinzu, wie eine Antwort akzeptiert. – Coderaemon

Antwort

15

Sie müssen das Objekt request nicht in den Kontext einschließen, da die generischen Ansichten das Objekt request an den Serialisierungskontext übergeben.

DRF Quellcode-Schnipsel:

# 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 
    } 

In Ihrem Serializer können Sie access das request Objekt mit .context Attribut.

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

Serializer sind die Art, wie externe Daten von/zu Modellen (Django oder einfache Python-Klassen) abgebildet werden.

Ansichten befassen sich damit, wie die Daten angezeigt werden. Drosselung, Seitenumbruch, Authentifizierung werden von der Ansicht verwaltet. Sie behandeln auch den Datensatz.

DRF stellt eine context bereit, um anforderungsspezifische Daten an den Serializer zu übergeben, ohne die Initialisierung neu definieren zu müssen. Das ist wahrscheinlich das, wonach Sie suchen.

+0

Versuchte Übergabe Kontext aus Ansichten 'serializer_class = ProductSerializer (Kontext = {'Anfrage': Anfrage})' es sagt 'NameError: Name 'Anfrage' ist nicht definiert ' – Coderaemon

+1

serializer_class sollte eine Klasse sein, keine Instanz. – Linovia

+0

Sie sollten die 'Sicht außer Kraft setzen get_serializer_context' – Linovia

Verwandte Themen