জ্যাঙ্গো বনাম বনাম ওভাররাইডিং সেভ পদ্ধতির সংকেত


89

আমার মাথাটি মুড়ে ফেলাতে সমস্যা হচ্ছে। এই মুহূর্তে আমার কাছে এমন কিছু মডেল রয়েছে যা দেখতে একরকম দেখাচ্ছে:

 def Review(models.Model)
    ...fields...
    overall_score = models.FloatField(blank=True)

def Score(models.Model)
    review = models.ForeignKey(Review)
    question = models.TextField()
    grade = models.IntegerField()

একটি পর্যালোচনার বেশ কয়েকটি "স্কোর" রয়েছে, সামগ্রিক_স্কোর স্কোরের গড়। যখন একটি পর্যালোচনা বা স্কোরটি সংরক্ষণ করা হয়, তখন আমার সামগ্রিক_স্কোর গড়ের গণনা করা দরকার। এখনই আমি একটি ওভাররাইড সংরক্ষণ পদ্ধতি ব্যবহার করছি। জ্যাঙ্গোর সিগন্যাল প্রেরণকারী ব্যবহার করে কি কোনও উপকার হবে?

উত্তর:


85

সংরক্ষণ / মোছা সংকেতগুলি সাধারণত এমন পরিস্থিতিতে অনুকূল হয় যেখানে আপনার এমন পরিবর্তন করতে হবে যা প্রশ্নে থাকা মডেলটির সাথে পুরোপুরি সুনির্দিষ্ট নয়, বা এমন কিছু মডেলগুলিতে প্রয়োগ করা যেতে পারে যা কিছু সাধারণ, বা মডেলগুলিতে ব্যবহারের জন্য কনফিগার করা যেতে পারে।

ওভাররাইড saveপদ্ধতিতে একটি সাধারণ কাজ একটি মডেলের কিছু পাঠ্য ক্ষেত্র থেকে স্লাগগুলি স্বয়ংক্রিয়ভাবে তৈরি করা generation এটি এমন একটি উদাহরণ যা আপনি যদি বেশ কয়েকটি মডেলের জন্য এটি প্রয়োগ করতে চান তবে একটি pre_saveসিগন্যাল ব্যবহার করে উপকৃত হবেন , যেখানে সংকেত হ্যান্ডলারটি স্লাগ ক্ষেত্রের নাম এবং ক্ষেত্রের নাম থেকে স্লাগ তৈরি করতে পারে। একবার আপনার মতো জায়গায় কিছু হয়ে গেলে, আপনি যে কোনও বর্ধিত কার্যকারিতা স্থাপন করবেন তা সমস্ত মডেলের ক্ষেত্রেও প্রযোজ্য হবে - যেমন স্লাগটি আপনি প্রশ্নের মধ্যে থাকা মডেলের ধরণটি যোগ করতে চলেছেন, স্বতন্ত্রতা নিশ্চিত করতে।

পুনরায় ব্যবহারযোগ্য অ্যাপ্লিকেশনগুলি প্রায়শই সিগন্যালের ব্যবহার থেকে উপকৃত হয় - তাদের সরবরাহিত কার্যকারিতা যদি কোনও মডেলের ক্ষেত্রে প্রয়োগ করা যায় তবে তারা সাধারণত (এটি অপ্রয়োজনীয় না হলে) ব্যবহারকারীরা এগুলি থেকে উপকৃত হওয়ার জন্য তাদের মডেলগুলিকে সরাসরি পরিবর্তন করতে হবে না।

সঙ্গে জ্যাঙ্গো-mptt , উদাহরণস্বরূপ, আমি ব্যবহার pre_saveসংকেত ক্ষেত্র যা মডেল যা সম্পর্কে তৈরি করা বা আপডেট করা হয় এবং জন্য একটি গাছ গঠন বর্ণনা একটি সেট পরিচালনা করতে pre_deleteসংকেত বস্তুর জন্য ট্রী কাঠামো বিবরণ মুছে ফেলার জন্য মুছে ফেলা হচ্ছে এবং তার সম্পূর্ণ এর আগে বস্তুর উপ-গাছ এবং সেগুলি মুছে ফেলা হয়। সংকেত ব্যবহারের কারণে, ব্যবহারকারীদের তাদের পরিচালনা বা পরিচালনা করতে তাদের মডেলগুলিতে সংযোজন বা সংশোধন করতে হবে না saveবা deleteপদ্ধতি পরিবর্তন করতে হবে না , তারা কেবল জ্যাঙ্গো-এমপিটি কে জানাতে হবে যে তারা কোন মডেলগুলি পরিচালনা করতে চায়।


সিগন্যাল হ্যান্ডলার যদি ব্যতিক্রম ঘটায়? আমি মনে করি তাদের ব্যতিক্রমগুলি ট্রিগার করা উচিত নয়, অন্যথায় তারা ভাল ফিট নন। আমি কি ভূল?
x-yuri

20

তুমি জিজ্ঞেস করেছিলে:

জ্যাঙ্গোর সিগন্যাল প্রেরণকারী ব্যবহার করে কি কোনও উপকার হবে?

আমি এটি জ্যাঙ্গো ডক্সে পেয়েছি:

ওভাররাইড মডেল পদ্ধতিগুলি বাল্ক অপারেশনে ডাকা হয় না

মনে রাখবেন যে কোয়েরীসেট ব্যবহার করে বা ক্যাসকেডিং মুছার ফলস্বরূপ বাল্কে অবজেক্টগুলি মুছে ফেলার সময় কোনও অবজেক্টের জন্য মুছে ফেলা () পদ্ধতিটি প্রয়োজনীয়ভাবে বলা হয় না। কাস্টমাইজড ডিলিট লজিক কার্যকর হয়ে গেছে তা নিশ্চিত করতে, আপনি প্রাক_ডিলিট এবং / অথবা পোস্ট_ডিলিট সিগন্যাল ব্যবহার করতে পারেন।

দুর্ভাগ্যক্রমে, বাল্কে অবজেক্ট তৈরি বা আপডেট করার সময় কোনও কার্যকারিতা নেই, যেহেতু সংরক্ষণ (), প্রাক_সেজ এবং পোস্ট_সেভের কোনওটিকেই বলা হয় না।

থেকে: ওভাররাইডিং পূর্বনির্ধারিত মডেল পদ্ধতিগুলি


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

8
এটি আরও বলেছে "দুর্ভাগ্যক্রমে, বাল্কে অবজেক্ট তৈরি বা আপডেট করার সময় কোনও কার্যকারিতা নেই, যেহেতু সংরক্ষণ (), প্রাক_সেজ এবং পোস্ট_সেভের কোনওটিকেই বলা হয় না।" - সুতরাং আমি মনে করি না যে এটি এই পদ্ধতির মধ্যে একটি বাণিজ্য।
কোরি

এটি উভয় পদ্ধতির ক্ষেত্রেই প্রযোজ্য, এরপরেও কি উত্তরটি পাওয়া যায়: "না, saveপদ্ধতিটি ওভাররাইড করার বিপরীতে সংকেতগুলি ব্যবহার করার কোনও লাভ নেই "?
ফ্লিম

3

আপনি যদি সিগন্যাল ব্যবহার করেন তবে প্রতিবার সম্পর্কিত স্কোর মডেলটি সংরক্ষণ করা হলে আপনি পর্যালোচনা স্কোর আপডেট করতে সক্ষম হবেন। তবে যদি এই জাতীয় কার্যকারিতাটির প্রয়োজন না হয় তবে আমি এটিকে সংকেত দেওয়ার কোনও কারণ দেখতে পাচ্ছি না, এটি বেশ মডেল সম্পর্কিত জিনিস।



1

বাল্ক মুছে ফেলার বিষয়ে জাজানো ডক্স থেকে ছোট সংযোজন ( বস্তুগুলির .delete()পদ্ধতি QuerySet):

মনে রাখবেন যে এটি যখনই সম্ভব হবে তখন এসকিউএলে খাঁটিভাবে কার্যকর করা হবে এবং সুতরাং প্রক্রিয়া চলাকালীন পৃথক বস্তুর উদাহরণগুলির মুছে ফেলা () পদ্ধতিগুলি কল করা হবে না। আপনি যদি কোনও মডেল শ্রেণিতে একটি কাস্টম মোছা () পদ্ধতি সরবরাহ করে থাকেন এবং এটির নামটি নিশ্চিত করাতে চান তবে আপনাকে সেই মডেলের উদাহরণগুলি "ম্যানুয়ালি" মুছে ফেলতে হবে (উদাহরণস্বরূপ, ক্যোরিসেটের পুনরাবৃত্তি এবং কলটি মুছে ফেলার মাধ্যমে) প্রতিটি বস্তু স্বতন্ত্রভাবে) কোয়েরীসেটের বাল্ক মুছুন () পদ্ধতিটি ব্যবহার না করে।

https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

এবং বাল্ক আপডেট ( বস্তুগুলির .update()পদ্ধতি QuerySet):

পরিশেষে, উপলব্ধি করুন যে আপডেট () এসকিউএল স্তরে একটি আপডেট করে এবং এইভাবে, আপনার মডেলগুলিতে কোনও সংরক্ষণ () পদ্ধতি কল করে না, বা এটি প্রাক_সেভ বা পোস্ট_সেভ সিগন্যালগুলি নির্গত করে না (যা মডেল.সেভ (কল করার ফলাফল) ))। আপনি যদি এমন কোনও মডেলের কাস্টম সেভ () পদ্ধতি রয়েছে তার জন্য রেকর্ডগুলির একটি গুচ্ছ আপডেট করতে চান, সেগুলি থেকে লুপ করুন এবং সেভ () কে কল করুন

https://docs.djangoproject.com/en/2.1/ref/models/querysets/#update


এটি কি উভয়ের জন্য প্রযোজ্য নয়?
ফ্লিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.