মডেল.পি বিশাল আকার ধারণ করছে, এটি ভেঙে ফেলার সেরা উপায় কী?


91

আমার তত্ত্বাবধায়ক এর দিকনির্দেশ: "আমি কোনও যুক্তি এড়ানো এড়াতে চাই models.py। এখান থেকে, আসুন আমরা এটি ডাটাবেস অ্যাক্সেসের জন্য কেবল ক্লাস হিসাবে ব্যবহার করি এবং সমস্ত যুক্তি বাইরের ক্লাসগুলিতে রাখি যা মডেলগুলির ক্লাসগুলি ব্যবহার করে, বা তাদের মোড়ক দেয়।"

আমার মনে হচ্ছে এটি যাওয়ার ভুল উপায়। আমি অনুভব করি যে কেবল ফাইলকে ছোট রাখতে মডেলগুলির বাইরে যুক্তি রাখা দূষিত ধারণা। যদি যুক্তিতে মডেলটি সর্বোত্তম হয় তবে ফাইল আকারের নির্বিশেষে এটিই হওয়া উচিত।

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

সুতরাং, মডেল.পি ফাইল থেকে মডেল ক্লাসগুলি সরিয়ে দেওয়ার কোনও সহজ উপায় আছে, তবে এখনও মডেলগুলি জ্যাঙ্গো সমস্ত সরঞ্জাম দিয়ে কাজ করে? অথবা, কোনও "বৃহত" মডেল.পি ফাইলের সাধারণ সমস্যার সম্পূর্ণ আলাদা তবে মার্জিত সমাধান রয়েছে? কোন ইনপুট প্রশংসা হবে।


7
আপনি কি আমদানি বিবৃতি জানেন, তাই না?
বালফা

7
পুনশ্চ. আমি এর অর্থ আপত্তিজনকভাবে বোঝাতে চাই না, আমি কেবল আপনি কোথায় আছেন তা জানতে চাই।
বালফা

4
হ্যাঁ, তবে আমি জানতাম না যে জাঙ্গোর প্রশাসক সরঞ্জামগুলি কেবল মডেলগুলিতে টানতে আমদানির বিবৃতি ব্যবহার করে কাজ করবে কিনা। আমি বরং বরং এখানে জিজ্ঞাসা করব যে জ্যাঙ্গোর সরঞ্জামগুলি তাদের সাথে ভাল খেলছে না তা খুঁজে পেতে কেবল প্লে ওলে আমদানি ব্যবহার করে চেষ্টা করার জন্য প্রচুর সময় ব্যয় করা উচিত। আমি স্বীকার করি আমি অজগর এবং জাঙ্গোতে আরও নতুন, তাই সম্ভবত আমি কেবলমাত্র আমদানির বিবরণীর একটি সহজ বোঝাপড়ায় ...
এডিটেড

উত্তর:


64

জাজ্যাঙ্গো একটি বড় অ্যাপ্লিকেশনটির পরিবর্তে আপনাকে অনেকগুলি ছোট অ্যাপ্লিকেশন তৈরি করতে দেয়।

প্রতিটি বৃহত অ্যাপ্লিকেশনের অভ্যন্তরে অনেকগুলি ছোট ছোট অ্যাপ্লিকেশন ফ্রি হতে লড়াই করে।

আপনার যদি models.pyবড় মনে হয় তবে আপনি অনেক কিছু করছেন। থামো। আরাম করুন। পচে যাওয়া

আরও ছোট, সম্ভাব্য পুনরায় ব্যবহারযোগ্য ছোট অ্যাপ্লিকেশন উপাদানগুলি বা টুকরাগুলি সন্ধান করুন। আপনি করতে হবে না আসলে তাদের পুনরায় ব্যবহার করে। তাদের সম্পর্কে সম্ভবত পুনরায় ব্যবহারযোগ্য হিসাবে ভাবুন।

আপনার আপগ্রেডের পাথগুলি বিবেচনা করুন এবং অ্যাপ্লিকেশনগুলি পচন করুন যা আপনি কোনও দিন প্রতিস্থাপন করতে চাইতে পারেন। আপনাকে আসলে এগুলি প্রতিস্থাপন করতে হবে না , তবে আপনি এগুলি প্রোগ্রামিংয়ের এককভাবে "মডিউল" হিসাবে বিবেচনা করতে পারেন যা ভবিষ্যতে শীতল কিছু দিয়ে প্রতিস্থাপিত হতে পারে।

আমাদের প্রায় এক ডজন অ্যাপ্লিকেশন রয়েছে, প্রতিটি model.pyকোডের প্রায় 400 লাইনের চেয়ে বেশি নয়। সেগুলি প্রায় অর্ধ-দশকেরও কম স্বতন্ত্র শ্রেণির সংজ্ঞায় মনোনিবেশ করছে। (এগুলি কঠোর সীমা নয়, তারা আমাদের কোড সম্পর্কে পর্যবেক্ষণ're

আমরা তাড়াতাড়ি এবং প্রায়শই পচে যায়।


4
ঠিক পয়েন্ট এ। যে কোনও অ-তুচ্ছ ওয়েব অ্যাপ্লিকেশনটি বেশ কয়েকটি ছোট 'অ্যাপস' হবে। contrib এবং অন্যান্য জনপ্রিয় অ্যাপ্লিকেশনগুলির একটি ইঙ্গিতটি নিতে, ব্যবহারকারী প্রমাণীকরণ এক অ্যাপ্লিকেশন, ট্যাগিং অন্য এক, ইউজার প্রোফাইল আরও একটি, ইত্যাদি হয়
জাভিয়ের

4
যদিও এটি "সঠিক" উপায় এবং এটি জানার জন্য সহায়ক, এটি আমি ঠিক যা খুঁজছিলাম তা নয়। আমি কী ধরণের উত্তর খুঁজছিলাম তা জানার কোনও উপায় না থাকলে আমি ক্ষমা চাইছি। :)
Eddified

@ সংযুক্ত: আপনি যদি এটি না করেন তবে এটি কেবল আরও খারাপ হতে চলেছে। এখনই বিভাজন শুরু করুন।
এস .লট

যথেষ্ট মজার বিষয়, এই মুহুর্তে আমি জ্যাকব কাপলান মোস (ওসকন-এ) শুনে আসছি ঠিক এটি দুর্দান্ত এবং দৃ strongly়ভাবে ন্যায়সঙ্গত বিশদে বর্ণনা করছি ;-)।
অ্যালেক্স মার্তেলি

13
গ্লেন মেইনার্ডের উত্তর এটির চেয়ে আরও ভাল। একটি জটিল ওয়েব অ্যাপ্লিকেশনকে অনেকগুলি অ্যাপ্লিকেশনে ভাগ করা অবশ্যই একটি ভাল অনুশীলন, তবে এটি একটি অ্যাপ্লিকেশন সহ একটি মডেল.পি ফাইল আপের পুনঃস্থাপন করা। দুটি ক্রিয়াটি অরথোগোনাল হতে পারে।
এরিক

108

মডেল ক্লাসগুলির পক্ষে মডেলটিতে কাজ করার পদ্ধতি থাকা স্বাভাবিক। যদি আমার কাছে কোনও পদ্ধতির সাথে একটি বইয়ের মডেল থাকে তবে book.get_noun_count()এটি যেখানে এটির সাথে যুক্ত - আমি " get_noun_count(book)" লিখতে চাই না , যদি না পদ্ধতিটি আসলে অভ্যন্তরীণভাবে অন্য কোনও প্যাকেজের সাথে সম্পর্কিত না হয়। (এটি হতে পারে - উদাহরণস্বরূপ, যদি আমার কাছে " get_amazon_product_id(book)" দিয়ে অ্যামাজনের এপিআইতে অ্যাক্সেস পাওয়ার জন্য কোনও প্যাকেজ থাকে ))

জ্যাঙ্গোর ডকুমেন্টেশনে একটি একক ফাইলে মডেল স্থাপনের পরামর্শ দেওয়া হয়েছিল এবং আমি কীভাবে এটি একটি উপযুক্ত উপ-প্যাকেজের মধ্যে বিভক্ত করব তা নির্ধারণের জন্য প্রথম থেকেই কয়েক মিনিট সময় নিয়েছিলাম in

site/models/__init__.py
site/models/book.py

__init__.py দেখতে:

from .book import Book

তাই আমি এখনও "সাইট থেকে মডেলগুলি লিখতে পারি mod


নিম্নলিখিতটি কেবল জ্যাঙ্গো ১.7 এর পূর্ববর্তী সংস্করণগুলির জন্য প্রয়োজনীয়, https://code.djangoproject.com/ticket/3591 দেখুন

একমাত্র কৌশলটি হ'ল জাজানোতে একটি বাগের কারণে আপনার প্রতিটি মডেলের অ্যাপ্লিকেশন স্পষ্টভাবে সেট করা দরকার: এটি ধরে নিয়েছে যে অ্যাপ্লিকেশনটির নামটি মডেলের পথে তৃতীয় থেকে শেষ প্রবেশ। "সাইট.মোডেলস.বুক" "সাইট" এর ফলাফল দেয় যা সঠিক; "সাইট.models.book.Book" এটি অ্যাপ্লিকেশনটির নাম "মডেল" মনে করে। এটি জ্যাঙ্গোর পক্ষ থেকে একটি সুন্দর বাজে হ্যাক; এটি সম্ভবত উপসর্গের ম্যাচের জন্য ইনস্টল থাকা অ্যাপ্লিকেশনগুলির তালিকা অনুসন্ধান করবে।

class Book(models.Model):
    class Meta: app_label = "site"

আপনি সম্ভবত এটি সাধারণকরণের জন্য বেস ক্লাস বা মেটাক্লাস ব্যবহার করতে পারেন, তবে আমি এখনও এটি নিয়ে বিরক্ত করি না।


4
+1 আমি এটি সাফল্যের সাথে ব্যবহার করেছি। যদিও এস লট একাধিক অ্যাপ্লিকেশনগুলির মধ্যে একটি সঠিক ধারণা হিসাবে সঠিক, তবে এটি এখানে এবং এখন সমাধান।
আলেকজান্ডার লাজংবার্গ

35
যখন আপনার মডেলগুলি ঘনিষ্ঠভাবে এবং স্বতন্ত্রভাবে সম্পর্কিত হয় তখন জিনিসগুলিকে গুচ্ছ অ্যাপগুলিতে বিভক্ত করার খুব বেশি সুবিধা আমি দেখতে পাই না।
গ্লেন মেইনার্ড

4
এই আমার আগ্রহ। আমি জাজানো উইকি লিঙ্কের স্কমপ্ট পোস্ট করে পড়েছি এবং এটি পেয়েছি: "বর্তমানের প্রধান শাখায় এটি মেটা শ্রেণির অ্যাপ্লিকেশনগুলি ছাড়াই কাজ করার জন্য যাচাই করা হয়েছে।" সুতরাং এর অর্থ কি যদি আপনি মূল শাখার সাথে কাজ করছেন তবে আমরা মেটা: অ্যাপ_লবেল স্টাফ ফেলে দিতে পারি? এই সমস্যাটি সমাধানের জন্য টিকিট সম্পর্কে মন্তব্য করার পরে এটি বিভ্রান্তিকর।
ড্যান.স্ট্যাক ওভারফ্লো

4
আমি কেবল ট্রাঙ্ক দিয়ে পরীক্ষা করেছি (আজ আগের হিসাবে, r11286); যদি অ্যাপ_নামটি সেট না করা থাকে, মডেলটি কেবল "স্ক্যালাল অ্যাপনাম" এ প্রদর্শিত হবে না এবং সম্ভবত সিঙ্কডিবি দ্বারা তৈরি করা হবে না (তবে আমি এটি ব্যবহার করি না তাই এটি পরীক্ষা করতে পারি না)। এটি বেশ বিভ্রান্তিকর ত্রুটিযুক্ত মামলা, কারণ এটি কোনও ত্রুটি ট্রিগার করে না; এটি নিঃশব্দে প্রদর্শিত হয় না।
গ্লেন মেইনার্ড

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

5

আপনার সম্ভাব্য সমস্যাগুলির মধ্যে আমি বেশিরভাগই পেতে পারি না। উত্তরগুলির সাথে এখানে কয়েকটি সম্ভাবনা রয়েছে:

  • একই ফাইলে একাধিক মডেল

    এগুলি পৃথক ফাইলে রাখুন। যদি নির্ভরতা থাকে তবে অতিরিক্ত মডেলগুলিতে টানতে আমদানিটি ব্যবহার করুন।

  • মডেল.পিতে এক্সটেনারাস লজিক / ইউটিলিটি ফাংশন

    অতিরিক্ত যুক্তি পৃথক ফাইলে রাখুন।

  • ডাটাবেস থেকে কিছু মডেল উদাহরণ নির্বাচন করার জন্য স্থির পদ্ধতি methods

    একটি পৃথক ফাইলে একটি নতুন পরিচালক তৈরি করুন।

  • পদ্ধতিগুলি স্পষ্টতই মডেলের সাথে সম্পর্কিত

    save, __unicode__ এবং get_absolve_url এর উদাহরণ।

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