2015-01-14 8 views
22

Czy można uzyskać aktualnego użytkownika w serializatorze modelu? Chciałbym to zrobić bez konieczności odgałęzienia się od generycznych, ponieważ jest to proste zadanie, które trzeba wykonać.Otrzymuj bieżącego użytkownika w Model Serializatorze

Mój model:

class Activity(models.Model): 
    number = models.PositiveIntegerField(
     blank=True, null=True, help_text="Activity number. For record keeping only.") 
    instructions = models.TextField() 
    difficulty = models.ForeignKey(Difficulty) 
    categories = models.ManyToManyField(Category) 
    boosters = models.ManyToManyField(Booster) 

    class Meta(): 
     verbose_name_plural = "Activities" 

Moja serializer:

class ActivitySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Activity 

A mój widok:

class ActivityDetail(generics.RetrieveUpdateDestroyAPIView): 

    queryset = Activity.objects.all() 
    serializer_class = ActivityDetailSerializer 

Jak mogę dostać model wrócił z dodatkowym polu user takie, że moja odpowiedź wygląda następująco:

{ 
    "id": 1, 
    "difficulty": 1, 
    "categories": [ 
     1 
    ], 
    "boosters": [ 
     1 
    ], 
    "current_user": 1 //Current authenticated user here 
} 

Odpowiedz

30

Znalazłem odpowiedź poprzez kod źródłowy Djangorestframework.

class ActivitySerializer(serializers.ModelSerializer): 

    # Create a custom method field 
    current_user = serializers.SerializerMethodField('_user') 

    # Use this method for the custom field 
    def _user(self, obj): 
     user = self.context['request'].user 
     return user 

    class Meta: 
     model = Activity 
     # Add our custom method to the fields of the serializer 
     fields = ('id','current_user') 

Kluczem jest fakt, że metody zdefiniowane wewnątrz ModelSerializer mieć dostęp do własnej sytuacji, która zawsze zawiera żądanie (który zawiera użytkownikowi, gdy jeden jest uwierzytelnione). Ponieważ moje uprawnienia są przeznaczone tylko dla uwierzytelnionych użytkowników, zawsze powinno być coś tutaj.

Można to również zrobić w innych wbudowanych serializatorach djangorestframework.

+0

Jak uzyskać dostęp do tej zmiennej? Podobnie ustawiłem kopalnię, ale w metodzie create() nie mogę uzyskać dostępu do zmiennej. Nie ma go również w request.POST. – Craig

+0

Użyłem powyższego kodu, ale podając następujący błąd: Plik "/Users/abc/abc/Django/Work/abc/abc/src/MadhaparGamApps/serializers/newsfeedSerializer.py", wiersz 21, w _user użytkownik = self.context ['request']. user KeyError: 'request' –

+1

Dla każdego, kto otrzymuje żądanie KeyError: Możesz rozwiązać ten problem poprzez zainicjalizowanie serializera z widoku za pomocą obiektu żądania w następujący sposób: serializer = serializers.RandomSerializer (data = request.data, context = {'request': request}) Źródło: http://www.django-rest-framework.org/api-guide/serializers/#saving-instances –

13

Kontekst jest przekazywany do serializera w strukturze REST, która domyślnie zawiera żądanie. Więc możesz po prostu użyć self.context['request'].user wewnątrz serializera.