2015-04-20 40 views
5

kullanma django-dinlenme-çerçeve 3 ile kullanıcı oluşturmak ve Django-dinlenme-çerçeve ModelViewSerializer kullanarak bir kullanıcı oluşturmaya çalışıyorum 1.8Django kalan çerçeve parolası

django. Sorun, DRF tarafından kullanılan varsayılan objects.create yönteminin parolayı düz metin olarak bırakmasıdır.

Sorun, DRF dizileyici oluşturma yönteminin objects.create_user yöntemini kullanmak yerine objects.createquerysets/#create yöntemini kullanmasıdır.

kod satırı serializers.py den 775

instance = ModelClass.objects.create(**validated_data) 

bunun için en iyi çözüm nedir? objects.create yerine objects.user_create kullanmak için serializer.create yöntemini geçersiz kılabilirim ancak doğru çözüm gibi hissetmiyorum. kod

dinlenme:

class UserSerializer(serializers.ModelSerializer): 
    # .... 

    def create(self, validated_data): 
     user = User.objects.create_user(**validated_data) 
     return user 

diğer çözümler ViewSet sınıfında perform_create geçersiz kılma olabilir ya da viewset sınıfında kendi create yöntemi yazabilirsiniz:

from django.contrib.auth.models import User 
from rest_framework import viewsets 

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('username', 'email','password') 
     write_only_fields = ('password',) 


class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer = UserSerializer() 
+3

Neden sana doğru görünmüyor

from django.contrib.auth.hashers import make_password class UserSerializer(serializers.ModelSerializer): def validate_password(self, value: str) -> str: return make_password(value) 
? Bence böyle giderim. Biraz arandı ve en azından bu SO postunu (farklı soru) buldu, ancak 'create()' yi geçersiz kılmak, kabul edilen cevapta bu amaçla kullanılır. http: // stackoverflow.com/a/27763502/870769 – sthzg

cevap

8

Eğer UserSerilizer içinde create geçersiz kılabilirsiniz

class UserViewSet(viewsets.ModelViewSet): 
    def create(self, request, format=None): 
     # create user here 
     # do not call seriailzer.save() 

GÜNCELLEME:

class UserViewSet(viewsets.ModelViewSet, mixins.CreateModelMixin): 
    def perform_create(self, serializer): 
     # use User.objects.create_user to create user 
     pass 

NOT: Bu cevap 3 çözümler sunar, iyi ihtiyaçlarınıza uyan sence birini seçmek @freethebees sonra da, işte çalışır kod parçacığı olduğunu perform_create basan, yorumladı basitçe özel dönebilirsiniz orada çünkü ve proje ekosistemi

NOT 2 şahsen UserViewSet (ikinci kod parçacığı) içinde create geçersiz kılma tercih Response (örneğin, giriş yaptıktan sonra kullanıcı profilini geri döndür)

+0

Neden ViewSet işlevinde 'perform' yöntemini yerine "create" yöntemini bir serialiser içinde geçersiz kılmayı öneriyorsunuz? – freethebees

+0

@freethebees eski bir cevap, nedenini hatırlamıyorum :-), ama haklısın 'perform_create' daha temiz bir çözüm gibi görünüyor, cevabımı güncelleyeceğim. – aliva

+0

Oh, her iki yoldan da daha iyi olduğunu iddia etmiyordum. Sadece ilgileniyordum. Her iki yöntemin de net bir seçim olacağını görmedim. – freethebees

1

serializers.Modelserializer.create()'daki işlevselliği kaçırdığınız @ aliva'nın yanıtına ek olarak (örneğin, çoktan çoğa ilişkilerin işlenmesi gibi oldukça iyi olabilir), Bunu korumanın bir yolu var. Bu süper sınıf işlevselliği tutmanın faydası, ancak veri tabanına ek yazma dezavantajı vardır

class UserSerializer(serializers.ModelSerializer): 

    def create(self, validated_data): 
     user = super().create(validated_data) 
     user.set_password(validated_data['password'] 
     user.save() 
     return user 

: user.set_password() yöntemi kullanarak

, şifresi de doğru gibi ayarlanabilir. Hangi trade-off'ın sizin için daha önemli olduğuna karar verin :-).

1

serileştiriciye şifreyi doğrulamak için daha iyi bir seçenek var