2015-04-20 16 views
5

का उपयोग Django-आराम-ढांचा 3 के साथ उपयोगकर्ता बना सकते हैं और django 1.8Django बाकी ढांचे पासवर्ड

मैं Django-आराम-ढांचे ModelViewSerializer का उपयोग कर एक उपयोगकर्ता बनाने के लिए कोशिश कर रहा हूँ। समस्या यह है कि डिफ़ॉल्ट ऑब्जेक्ट्स। डीआरएफ द्वारा उपयोग की जाने वाली विधि पासवर्ड को सादे पाठ के रूप में छोड़ देती है।

समस्या यह है कि डीआरएफ धारावाहिक बनाने की विधि विधि का उपयोग करने के बजाय objects.createquerysets/#create विधि का उपयोग कर रही है।

serializers.py लाइन से कोड 775

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

इसके लिए सबसे अच्छा समाधान क्या है? मैं serializer.create विधि को ऑब्जेक्ट्स के बजाय ऑब्जेक्ट्स.यूसर_क्रेट का उपयोग करने के लिए ओवरराइड कर सकता हूं। लेकिन यह सही समाधान की तरह महसूस नहीं करता है। कोड की

बाकी:

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

क्यों नहीं यह आप पर सही प्रतीत होता है? मुझे लगता है कि मैं उस तरह से जाऊंगा। थोड़ी सी खोज की और कम से कम इस एसओ पोस्ट (अलग सवाल) को मिला, लेकिन स्वीकार्य उत्तर में उस उद्देश्य के लिए 'create()' ओवरराइडिंग का उपयोग किया जाता है। http: // stackoverflow।com/a/27763502/870769 – sthzg

उत्तर

8

आप UserSerilizer में create ओवरराइड कर सकते हैं:

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

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

अन्य समाधान ViewSet कक्षा में perform_create अधिभावी हो सकता है या आप अपने viewset कक्षा में अपने स्वयं के create विधि लिख सकते हैं

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

अद्यतन: @freethebees के बाद टिप्पणी की, perform_create अधिभावी भी काम करता है, इसलिए यहाँ कोड का टुकड़ा है:

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

नोट: इस उत्तर 3 समाधान देता है, एक का चयन आपको लगता है आपकी आवश्यकताओं के फिट बैठता है और अपनी परियोजना के पारिस्थितिकी तंत्र

नोट 2 मैं व्यक्तिगत रूप से UserViewSet (दूसरा कोड स्निपेट) में create अधिभावी पसंद करते हैं क्योंकि वहाँ आप बस अपने कस्टम लौट सकते हैं Response (उदाहरण के लिए लॉगिन के बाद उपयोगकर्ता प्रोफ़ाइल वापसी)

+0

व्यूसेट में 'perform_create' की बजाय एक serialiser में 'create' विधि को ओवरराइड करने की सलाह क्यों दी जाएगी? – freethebees

+0

@freethebees यह एक पुराना उत्तर है, मुझे याद नहीं है क्यों :-), लेकिन आप सही हैं 'perform_create' क्लीनर समाधान प्रतीत होता है, मैं अपना जवाब अपडेट करूंगा। – aliva

+0

ओह मैं सुझाव नहीं दे रहा था कि कोई भी तरीका बेहतर था। मुझे बस दिलचस्पी थी। मैंने नहीं देखा है कि या तो विधि स्पष्ट विकल्प होगी। – freethebees

1

@ अलीवा के उत्तर के अलावा, जहां आप serializers.Modelserializer.create() (जो कि संरक्षित करने के लिए काफी अच्छा हो सकता है, उदाहरण के लिए कई से अधिक रिश्तों को संभालने) में कार्यवाही पर याद आती है, इसे रखने का एक तरीका है।

user.set_password() विधि का उपयोग करके, पासवर्ड भी सही ढंग से की तरह सेट किया जा सकता है,:

class UserSerializer(serializers.ModelSerializer): 

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

इस सुपर क्लास 'कार्यक्षमता रखने के लाभ, लेकिन डेटाबेस के लिए एक अतिरिक्त लिखने का नकारात्मक पहलू है। तय करें कि कौन सा व्यापार-बंद आपके लिए अधिक महत्वपूर्ण है :-)।

1

वहाँ serializer में पासवर्ड मान्य करने के लिए भी बेहतर विकल्प है

from django.contrib.auth.hashers import make_password 

class UserSerializer(serializers.ModelSerializer): 
    def validate_password(self, value: str) -> str: 
     return make_password(value) 
संबंधित मुद्दे