Próbowałem czegoś takiego, to nie działa.
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
def save(self):
user = self.context['request.user']
title = self.validated_data['title']
article = self.validated_data['article']
Potrzebuję sposobu uzyskania dostępu do request.user z mojej klasy Serializer.
django
django-rest-framework
PythonIsGreat
źródło
źródło
CurrentUserDefault
jest absolutnie ❤️ django-rest-framework.org/api-guide/validators/ ...Odpowiedzi:
Nie możesz uzyskać
request.user
bezpośredniego dostępu do . Musisz uzyskać dostęp do obiektu żądania, a następnie pobrać atrybut użytkownika.Lubię to:
Albo żeby być bardziej bezpiecznym,
Więcej na temat dodatkowego kontekstu można przeczytać tutaj
źródło
NameError: name 'self' is not defined
validate()
metodzie self.context jest pustym dyktando. Czemu?Właściwie nie musisz zawracać sobie głowy kontekstem. Jest na to znacznie lepszy sposób:
źródło
Jak Igor wspomniał w innej odpowiedzi, użyj może użyć CurrentUserDefault. Jeśli nie chcesz zastępować metody save tylko w tym celu, użyj doc :
źródło
Możesz przejść
request.user
, dzwoniąc.save(...)
w widoku:Oto model:
źródło
Potrzebujesz małej edycji w swoim serializatorze:
Oto przykład użycia zestawów widoków mieszania modelu. W
create
metodzie można znaleźć właściwy sposób wywołania serializatora. get_serializer poprawnie wypełnia słownik kontekstu. Jeśli potrzebujesz użyć innego serializatora, który jest następnie zdefiniowany w zestawie widoków, zapoznaj się zupdate
metodą inicjowania serializatora ze słownikiem kontekstowym, który również przekazuje obiekt żądania do serializatora.źródło