সিরিয়ালাইজারের তৈরি () এবং মডেলভিউসেটের তৈরি () সঞ্চালন_ক্রিয়েট () কখন ব্যবহার করবেন


95

আমি django-rest-frameworkএকটি মডেল অবজেক্ট তৈরি সম্পর্কিত প্রদত্ত ডকুমেন্টেশন পরিষ্কার করতে চাই । এখনও অবধি আমি খুঁজে পেয়েছি যে এই জাতীয় ইভেন্টগুলি কীভাবে পরিচালনা করবেন সে সম্পর্কে 3 টি পদ্ধতি রয়েছে।

  1. সিরিয়ালাইজারের create()পদ্ধতি। এখানে ডকুমেন্টেশন দেওয়া আছে

    class CommentSerializer(serializers.Serializer):
    
        def create(self, validated_data):
            return Comment.objects.create(**validated_data)
    
  2. মডেলভিউসেট create()পদ্ধতি। ডকুমেন্টেশন

    class AccountViewSet(viewsets.ModelViewSet):
    
        queryset = Account.objects.all()
        serializer_class = AccountSerializer
        permission_classes = [IsAccountAdminOrReadOnly]
    
  3. মডেলভিউসেট perform_create()পদ্ধতি। ডকুমেন্টেশন

    class SnippetViewSet(viewsets.ModelViewSet):
    
        def perform_create(self, serializer):
            serializer.save(owner=self.request.user)
    

আপনার প্রয়োগের পরিবেশের উপর নির্ভর করে এই তিনটি পদ্ধতি গুরুত্বপূর্ণ important

তবে কখন আমাদের প্রতিটি create() / perform_create()ফাংশন ব্যবহার করা দরকার ?? অন্যদিকে আমি কিছু অ্যাকাউন্ট পেয়েছি যে মডেলভিউসেট create()এবং সিরিয়ালাইজারের জন্য একটি পোস্টের অনুরোধের জন্য দুটি ক্রিয়েট মেথড ডেকে আনা হয়েছিল create()

আশা করি যে কেউ তাদের কিছু জ্ঞান ব্যাখ্যা করতে ভাগ করে নেবেন এবং এটি অবশ্যই আমার উন্নয়ন প্রক্রিয়ায় খুব সহায়ক হবে।

উত্তর:


125
  1. create(self, validated_data)প্রতিটি মডেলের ক্ষেত্রে ঠিক যেমন "AND" মানগুলি সংরক্ষণ করার আগে আপনি অবজেক্টে কোনও অতিরিক্ত বিশদ যুক্ত করতে ব্যবহার **validated_dataকরবেন। আদর্শভাবে বলতে গেলে, আপনি এই ফর্মটি "প্রোডডিং" কেবলমাত্র এক জায়গায় করতে চান তাই আপনার createপদ্ধতিটি CommentSerializerসেরা স্থান। এর শীর্ষে, আপনি নিজের অ্যাকাউন্টগুলিকে আপনার নিজের ডাটাবেসে সংরক্ষণ করার আগে বাহ্যিক এপিএসগুলি তাদের পক্ষে অ্যাকাউন্ট তৈরি করতে কল করতে পারেন। আপনার createসাথে এই ক্রিয়াটি ব্যবহার করা উচিত ModelViewSet। সর্বদা ভাবুন - "পাতলা দর্শন, ঘন সিরিয়ালাইজারগুলি"।

উদাহরণ:

def create(self, validated_data):
    email = validated_data.get("email", None)
    validated.pop("email") 
    # Now you have a clean valid email string 
    # You might want to call an external API or modify another table
    # (eg. keep track of number of accounts registered.) or even
    # make changes to the email format.

    # Once you are done, create the instance with the validated data
    return models.YourModel.objects.create(email=email, **validated_data)
  1. create(self, request, *args, **kwargs)ফাংশন ModelViewSetসংজ্ঞায়িত করা হয় CreateModelMixinবর্গ যার পিতা বা মাতা হয় ModelViewSetCreateModelMixinএর প্রধান কাজগুলি হ'ল:

    from rest_framework import status
    from rest_framework.response import Response
    
    
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    
    def perform_create(self, serializer):
        serializer.save()
    

আপনি দেখতে পাচ্ছেন যে উপরের createফাংশনটি আপনার সিরিয়ালাইজারে বৈধতা কল করার এবং সঠিক প্রতিক্রিয়া তৈরির যত্ন নেয়। এর পেছনের সৌন্দর্যটি হ'ল আপনি এখন নিজের অ্যাপ্লিকেশনটির যুক্তি আলাদা করতে পারবেন এবং বিশ্বজুড়ে এবং পুনরাবৃত্তিযোগ্য বৈধতা কলগুলি এবং পরিচালনা সংক্রান্ত প্রতিক্রিয়া আউটপুট :) সম্পর্কে নিজেকে উদ্বিগ্ন করতে পারবেন না। এটি create(self, validated_data)সিরিয়ালাইজারের (যেখানে আপনার নির্দিষ্ট অ্যাপ্লিকেশন যুক্তি থাকতে পারে) সন্ধানের সাথে মিল রেখে বেশ ভাল কাজ করে ।

  1. এখন আপনি জিজ্ঞাসা করতে পারেন, কেন perform_create(self, serializer)কেবলমাত্র এক লাইনের কোডের সাথে আমাদের আলাদা ফাংশন রয়েছে?!?! ঠিক আছে, এর পিছনে মূল কারণটি হ'ল saveফাংশনটি কল করার সময় অনুকূলিতকরণের অনুমতি দেওয়া allow কল করার আগে আপনি অতিরিক্ত ডেটা সরবরাহ করতে চাইতে পারেন save (যেমনserializer.save(owner=self.request.user) এবং আমাদের কাছে না থাকলে perform_create(self, serializer)আপনাকে ওভাররাইড করতে হবে create(self, request, *args, **kwargs)এবং এটি কেবল ভারী এবং বিরক্তিকর কাজ করে মিক্সিন দেওয়ার উদ্দেশ্যকে পরাস্ত করে।

আশাকরি এটা সাহায্য করবে!


ওহে! আপনার জ্ঞান ভাগ করে নেওয়ার জন্য ধন্যবাদ! create(self, validated_data)সিরিয়ালাইজারটি সম্পর্কে , এর অর্থ এটি ডেটা যাচাইয়ের যুক্তিতে ফোকাস করে? এবং আরও বেশি কি ডানটি দেওয়া সিরিয়ালাইজের ডেটা প্রতিক্রিয়ায় ফিরিয়ে দিতে সহায়তা করতে পারে?
রোল

4
না এই মুহুর্তে, আপনি ইতিমধ্যে আপনার সমস্ত বৈধতা পাস করেছেন। আমি এটির বিষয়ে বলছি যে কীভাবে আপনি কোনও বৈধ ডেটাবেসে সংরক্ষণের আগে বৈধতাযুক্ত ডেটা কাস্টমাইজ করতে চান। আমি আমার উত্তরে একটি উদাহরণ তৈরি করব।
অপুরভ কানসাল

4
কোনও উদ্বেগ নেই - আরও প্রসঙ্গ দেওয়ার জন্য কেবল একটি উদাহরণ যুক্ত করা হয়েছে।
অপুরভ কানসাল

4
হ্যাঁ এটিই চূড়ান্ত লাইন যা আপনার অবজেক্টটি ডাটাবেসে সংরক্ষণ করবে
অপুরভ কানসাল

4
সুতরাং createসিরিয়ালাইজের মধ্যে ফাংশনটি কেবল তখনই বলা হয় যখন আপনি করবেন serializer.save()। আপনার create(self, request)ফাংশন ভিতরে ( AccountViewSet), আপনি কলিং নেই serializer.save()এ সব এবং সেইজন্য, শুধুমাত্র উদাহরণস্বরূপ সৃষ্টি এই কলে সঙ্গে ঘটছে হয়: Account.objects.create_user(**serializer.validated_data)
অপুরভ কানসাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.