Sembra che stiate cercando un campo di sola scrittura. Quindi il campo sarà richiesto alla creazione, ma non verrà visualizzato all'utente (il contrario di un campo di sola lettura). Fortunatamente, Django REST Framework ora supporta i campi di sola scrittura con the write_only
attribute.
In Django REST Framework 3.0, è sufficiente aggiungere l'argomento aggiuntivo to the extra_kwargs
meta option.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = (
'userid',
'password'
)
extra_kwargs = {
'password': {
'write_only': True,
},
}
Perché il password
dovrebbe essere hashing (che si sta utilizzando utente di Django, giusto?), Si sta andando ad avere bisogno di hash anche la password come è venuta in. Questo dovrebbe essere fatto sulla vostra vista, molto probabilmente sovrascrivendo i metodi perform_create
e perform_update
.
from django.contrib.auth.hashers import make_password
class UserViewSet(viewsets.ViewSet):
def perform_create(self, serializer):
password = make_password(self.request.data['password'])
serializer.save(password=password)
def perform_update(self, serializer):
password = make_password(self.request.data['password'])
serializer.save(password=password)
In 2.x Django REST quadro, è necessario ridefinire completamente il campo password
sul serializzatore.
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = (
'userid',
'password'
)
Al fine di hash della password prima del tempo in 2.x Django REST Framework, è necessario eseguire l'override pre_save
.
from django.contrib.auth.hashers import make_password
class UserViewSet(viewsets.ViewSet):
def pre_save(self, obj, created=False):
obj.password = make_password(obj.password)
super(UserViewSet, self).pre_save(obj, created=created)
Questo risolverà il problema comune con le altre risposte, che è che la stessa serializzatore che viene utilizzato per creare/aggiornare l'utente sarà utilizzato anche per restituire l'oggetto utente aggiornata come risposta.Ciò significa che la password verrà comunque restituita nella risposta, anche se si desidera solo che sia di sola scrittura. Il problema aggiuntivo con questo è che la password può o non può essere hash nella risposta, che è qualcosa che davvero non vuoi fare.
Questo è esattamente quello che stavo cercando, anche se non utilizzo il modello utente Django - le password vengono già sottoposte a hash, ma è ancora più semplice in questo modo. Grazie. – wswld
Grazie! Aiutami molto –