04 জ্যাংগো Architecture পার্ট ০৩: Model তৈরি, Model এর ORM[ডাটাবেজ] ও Field অপশনগুলো

এ মডিউলে আমরা শিখবো Model এর-

  • Model তৈরি
  • ORM 
  • Fields 

আমাদেরকে প্রায়ই ডাটাবেইজ নিয়ে কাজ করতে হয়, ডাটাবেইজে টেবিল তৈরি, কলাম তৈরি, ডাটা ইনসার্ট, রিড, আপডেট বা ডিলেট করতে হয়! এ সকল কাজগুলো সাধারনত সিকুয়েল (SQL) ব্যবহার করে করতে হয়।

কিন্তু সরাসরি ‘র’ সিকুয়েল দিয়ে ডাটাবেইজ অপারেশনগুলো করতে আসলে অনেক কোড লিখতে হয়, এবং সিকুয়েল খুব সুবিধাজনক বা সুন্দর কোন ল্যাঙ্গুয়েজও নয় যে সেটা দিয়ে কোড করতে খুব ভালো লাগবে! (সবাইকে অবশ্য এ কাতারে ফেলা যাবেনা!)

এই বিরক্তিকর ‘র’ SQL লেখা থেকে মুক্তি দিতে O,R,M(Object Relational Mapping) এর আবির্ভাব!

Django ORM কি?  how its works

ORM হচ্ছে একটা পাইথনিকেলসিস্টেম, যে সিস্টেমের মাধ্যমে sql এর কাজ গুলো যেমন- ডাটাবেজ তৈরি করা যায়, query করা যায়, manipulate করা যায় এবং এর থেকে রেসাল্ট বের করে নিয়ে আসা যায়।

ORM এর মাধ্যমে আপনি অবজেক্ট অরিয়েন্টেড স্টাইলে কোড লিখেই ডাটা বেইজের সকল কাজ করতে পারবেন, ডাটাবেইজে ‘র SQL তৈরি করার কাজটা ORM ই করে দিবে, আপনার কোন সিকুয়েল কোড লিখার দরকার হবেনা।

ওআরএম কে আপনি একটা কনভার্টার হিসেবে কল্পনা করতে পারেন, যেটা আপনার পাইথন কোডগুলো সিকুয়েল কোডে রূপান্তর করে দিবে, এমনকি ভিন্ন ভিন্ন ‘রিলেশনাল ডাটাবেইজ ম্যানেজমেন্ট সিস্টেম’ (RDBMS) এর জন্য সেগুলোর প্রয়োজনীয় স্টাইলে সিকুয়েল লিখতে পারবে!

ORM এর মূল কাজ হচ্ছে ডাটাবেজের সাথে interect করা। অর্থাৎ ডাটাবেজে টেবিল তৈরি করা, ডিলিট করা, আপডেট করা অথবা কলাম ক্রিয়েট করা, ডিলিট করা, আপডেট করা এই ধরণের ইত্যাদি কাজ করা।
Models এ ডিফল্টভাবে ক্লাস তৈরি করাই থাকে।  আমরা একে import করে নিয়ে sql এর কাজগুলো করতে পারবো।
অর্থাৎ, Model ফাইল টা-ই হচ্ছে django এর ORM সিস্টেম। ORM এর মানে Object Relational mapper.
Models এর ভেতর যে ক্লাসটা তৈরি করছি সেটা ১টা object. আর object এর সাথে রিলেশন তৈরি করবে অর্থাৎ ম্যাপিং করবে সেটা হচ্ছে ORM.

ORM এর সুবিধাগুলোঃ

শুধু sql এ কাজ করার ক্ষেত্রে বড় বড় কমান্ড ব্যবহার করতে হয়, যেমন- টেবিল তৈরি করার জন্য- CREATE TABLE TABLE_NAME (COLUMN_NAME DATATYPES|…..]); টেবিল ডিলিট করার জন্য- DROP TABLE table_name; টেবিল পরিবর্তন করার জন্য- ALTER TABLE table_name ADD column_name COLUMN-definition; কমান্ডগুলো তুলনামূলক কঠিন।

কিন্তু, ORM ব্যবহার করে খুব সহজে sql এর ডাটাবেজ-টেবিল তৈরি, ডিলিট সহ অন্যান্য কাজগুলো করা যায়। এক্ষেত্রে, sql এর কমান্ডগুলো ছাড়াই Models এর মাধ্যমে sql এর কাজগুলো করা যায়।

মনে রাখবে, এই Models টা-ই হচ্ছে django এর ORM সিস্টেম।

Model তৈরি (বিস্তারিত ধারণা)

models.py ফাইলে চিত্রে দেখা যাচ্ছে, from django.db import models
# Create your models here.

এই প্রথম লাইনে models মডিউল ইম্পোর্ট করা হয়েছে। আমাদের একেকটা টেবিল হবে একেকটা ক্লাসক্লাসের এট্রিবিউট গুলো হবে টেবিলের কলাম! আর হ্যা, আমাদের সকল মডেল ক্লাসগুলোই উপরে ইম্পর্ট করা models.Model এর সাবক্লাস হবে
 
এখন আমরা, Post নামে একটা ক্লাস তৈরি করব(# Create your models here. কমেন্টটার পর):-
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    published_date = models.DateTimeField()
def __str__(self):
    return self.course
 
মডেল তৈরি হল, ডাটাবেইজ কিন্তু এখনো তৈরি হয়নি… এই মডেল অনুযায়ী ডাটাবেইজ তৈরি করতে আমাদেরকে manage.py ফাইলের দুটি কমান্ড এর সাথে পরিচিত হতে হবে।
 
makemigrations
আপনি কোন মডেল তৈরি করলে অথবা মডেলের কোন ফিল্ড (এট্রিবিউট) পরিবর্তন করলে আপনাকে কমান্ড প্রম্পট বা টার্মিনালে
python manage.py makemigrations কমান্ডটি দিতে হবে। এতে করে আপনার অ্যাপ ফোল্ডারে (আমাদের studymart ফোল্ডারে) থাকা migrations ফোল্ডারে একটি মাইগ্রেশন নাম্বার যুক্ত পাইথন ফাইল তৈরি হবে। সেই ফাইলের ভিতরে যে কোডগুলো থাকবে সেটা আসলে আপনার ডাটাবেইজ এর সিকুয়েল কোড কেমন হবে তারই একটা প্রতিরূপ! এর উপর ভিত্তি করেই আপনার ডাটাবেইজ টেবিল/কলাম/ডাটা তৈরি হবে। আপনি সিকুয়েল ভালো পারলে এখানে আপনার চাহিদা অনুযায়ী পরিবর্তন করতে পারবেন। মাইগ্রেশনের উল্লেখযোগ্য আরেকটা সুবিধা হল, প্রতিবার মডেল আপডেট করে makemigrations কমান্ড দিলে প্রতিবারই migrations ফোল্ডারে নতুন একটা ফাইল তৈরি হয়, যেটা ভার্শন কন্ট্রোল করাতে খুবই কাজের, অর্থাৎ আপনি যদি ভুলে ডাটাবেইজ আপডেট করেন তাহলে ব্যাক করে আগের অবস্থায় ফিরে যেতে পারবেন।
makemigrations কমান্ড দেয়ার পরও কিন্তু আপনার ডাটাবেইজ তৈরি হয়নি, আসল ডাটাবেইজ তৈরি হবে migrate কমান্ড দিলে।
 
migrate
মাইগ্রেশন তৈরি করার পর তা অনুযায়ী ডাটাবেইজ তৈরি করতে
 
python manage.py migrate
কমান্ডটি দিতে হবে। এটাই আপনার ডাটাবেইজ তৈরি করে দিবে।
লক্ষ্য করুন, প্রতিবার models.py তে মডেল যুক্ত বা আপডেট করলে ডাটাবেইজে সেটা ইমপ্লিমেন্ট করতে টার্মিনালে python manage.py makemigrations এবং python manage.py migrate কমান্ড দুটি দিতে হবে।
makemigrations কমান্ড কিন্তু ডাটাবেইজ তৈরি/আপডেট করেনা, শুধু একটা মাইগ্রেশন ফাইল তৈরি করে। এরপর migrate কমান্ডটা সেই মাইগ্রেশনের উপর ভিত্তি করে আসল ডাটাবেইজ তৈরি/আপডেট করে।

ডাটাবেইজ কনফিগারেশন: PostgreSQL

জ্যাঙ্গো মূলত ডাটাবেজ ড্রিভেন ফ্রেমওয়ার্ক। অর্থাৎ জ্যাঙ্গো ব্যবহার করতে হলে আপনাকে ডাটাবেইজ ব্যবহার করতে হবে, এবং জ্যাঙ্গোর সাথে ডাটাবেইজ কানেক্ট করে নিতে হবে। প্রাথমিক ভাবে জ্যাঙ্গো সিকুয়েল লাইট (SQLite) ডাটাবেইজ ব্যবহার করে, এটা লাইটওয়েট এবং কোন ধরনের সেটিংস দরকার হয়না, এবং এটা পাইথনের সাথে ডিফল্ট ভাবেই থাকে।

তবে আপনি যদি অন্য কোন ডাটাবেইজ যেমন মাই সিকুয়েল (MySQL), পোস্টগ্রে সিকুয়েল (PostgreSQL) ইত্যাদি ব্যবহার করতে চান তাহলে সেগুলোকে ঠিক মত কনফিগার করে নিতে হবে।

জ্যাঙ্গো প্রোজেক্ট এর সেটিংস ফাইল ওপেন করুনঃ (আমাদের প্রোজেক্টে ফাইলটা হল myproject/settings.py ) সেখানে DATABASES নামে একটা ডিকশনারি দেখতে পাবেন, যেটা দেখতে এরকমঃ

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

এখানে ডিফল্ট ডাটাবেইজ হিসেবে sqlite3 ব্যবহার করা হয়েছে। ‘ENGINE’ হল ডাটাবেইজ ড্রাইভারের নাম। এবং ‘NAME’ হল ডটাবেইজ এর নাম। (SQLite এর ক্ষেত্রে ফাইলের নাম, কেননা sqlite ডাটাবেইজ সিঙ্গেল ফাইলের ভিতর তৈরি হয়)

আপনি যদি অন্য কোন ডাটাবেজ ব্যবহার করতে চান তাহলে সেগুলোর কনফিগারেশন এখানে দিতে হবে, যেমন ধরি আমরা sqlite3 এর পরিবর্তে PostgreSQL ব্যবহার করব, তাহলে উক্ত ডিকশনারিটাকে এভাবে লিখতামঃ

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql', # ডটাবেইজ ড্রাইভার
        'NAME': 'mydatabasename', # ডাটাবেইজের নাম
        'USER': 'database_username', #ডাটাবেইজ ইউজারনেম
        'PASSWORD': 'D@T@B#S3_password', #ডাটাবেইজ পাসওয়ার্ড
        'HOST': '', #ডাটাবেইজ হোস্ট, লোকালহোস্ট ব্যবহার করতে চাইলে খালি রাখুন
        'PORT': '', # ডাটাবেইজ পোর্ট, ডিফল্ট ব্যবহার করতে চাইলে খালি রাখুন।
    }
}

উল্লেখিত ডিকশনারিতে আপনার ডাটাবেইজ অনুযায়ী ‘কি/ভ্যালু’ সেট করে দিতে হবে।

ডাটাবেইজ তৈরি হয়ে গেলে আমাদের কাজ হল মডেল তৈরি করা, মডেল এর কথা মনে আছেতো? ডাটাবেইজের সঙ্গে আমাদের যোগাযোগ হবে মডেলের মাধ্যমে…

বাস্তব উদাহরণ- ডাটাবেইজ সেটাপ ও ডাটাবেইজ সিঙ্ক্রোনাইজেশন

আমরা যদি ‍mysite/settings.py ফাইলটি টেক্সট এডিটরে খুলি তবে দেখবো ডাটাবেইজ এর জন্য একটি আলাদা সেকশন আছে ।

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': '', # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': '',
        'PASSWORD': '',
        'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '', # Set to empty string for default.
    }
}

এখানে –

  • ENGINE হলো ডাটাবেইজ ড্রাইভারের নাম ।
  • NAME হলো ডাটাবেইজের নাম । SQLite এর বেলায় ফাইলের নাম ।
  • USER ডাটাবেইজের ইউজার নেইম ।‍
  • PASSWORD হলো পাসওয়ার্ড ।
  • HOST হচ্ছে ডাটাবেইজ সার্ভার যে হোস্টে রান করছে তার নাম । লোকাল মেশিনের হোস্টনেম হবে localhost । উহ্য রাখলে জ্যাঙ্গো লোকালহোস্টই ব্যবহার করবে ।
  • PORT ডাটাবেইজ সার্ভার যে পোর্টে চালু আছে । সাধারণত এটির কোন মান দেওয়া লাগে না ।

আমরা একটি পূর্নাঙ্গ উদাহরণ দেখে নেই:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'student_database', 
        'USER': 'root',
        'PASSWORD': 'Pa55w0Rd',
        'HOST': '', 
        'PORT': '', 
    }
}

syncdb – ডাটাবেইজ সিঙ্ক্রোনাইজেশনঃ

ধরে নিচ্ছি আমরা যে ডাটাবেইজ ইনফরমেশন দিয়েছি settings.py এ তা সঠিক । এবার তাহলে ডাটাবেইজ সিঙ্ক্রোনাইজেশন এর পালা । একটি জ্যাঙ্গো সাইট বা প্রজেক্ট অনেকগুলো ছোট ছোট অ্যাপ্লিকেশনের সমন্বয়ে তৈরি হয় । এই অ্যাপ্লিকেশনগুলি settings.py এর INSTALLED_APPS সেকশনে যোগ করা হয় । বাই ডিফল্ট কতগুলো অ্যাপ্লিকেশন যোগ করাই থাকে এই লিস্টে । অনেক অ্যাপ্লিকেশনই ডাটাবেইজে তথ্য সংরক্ষন করে । তাই এদের প্রয়োজন পড়ে টেবিল তৈরি করার । manage.py এর syncdb কমান্ডটি এই কাজটিই করে দেয় আমাদের জন্য । আমরা টার্মিনালে রান করবো –

python manage.py syncdb

জ্যাঙ্গো একে একে সব গুলো অ্যাপ্লিকেশন এর জন্য টেবিল তৈরি করবে । এরপর একটি সুপারইউজার তৈরি করতে চাইবে । সম্মতি দিয়ে পছন্দমত ইউজারনেইম, ইমেইল অ্যাড্রেস এবং পাসওয়ার্ড দিয়ে তৈরি করে ফেলুন সুপারইউজারটি । পরে কাজে লাগবে । প্রসেসটি বেশ সিম্পল । স্ক্রীনের ইনস্ট্রাকশন ফলো করলেই কাজটি সম্পন্ন করতে পারবেন বেশ করে ।

পুনশ্চ: জ্যাঙ্গো শুধু মাত্র INSTALLED_APPS তালিকায় থাকা অ্যাপ্লিকেশনগুলোর জন্যই টেবিল তৈরি করবে । যে সকল অ্যাপ্লিকেশন আপনার প্রয়োজন সেগুলো যোগ করে syncdb চালান । তবে একবার টেবিল তৈরি করে পরে অ্যাপ্লিকেশন তালিকা থেকে রিমুভ করে দিলেও জ্যাঙ্গো ঐ টেবিল ডাটাবেইজ থেকে রিমুভ করবে না । যেসব অ্যাপ্লিকেশন আপনার দরকার পড়বে না সেগুলো syncdb চালানোর আগেই এই তালিকা থেকে মুছে দেওয়া বা কমেন্ট আউট করাই শ্রেয় ।

ডাটাবেইজে ডাটা ইনসার্ট, আপডেট, রিড, ডিলেট

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

মডেল তৈরি (এবং ডাটাবেইজ তৈরি) করার পর আমাদের কাজ হল সেখানে ডাটা ইনসার্ট করা, সেখানের ডাটা রিড, আপডেট বা ডিলেট করা। জ্যাঙ্গো ওআরএম আমাদেরকে এই কাজগুল করার জন্য সুন্দর একটা এপিআই দেয়, কুয়েরিসেট! কোডে চলে যাই, প্রথমেই কমান্ড প্রম্পট বা টার্মিনালে জ্যাঙ্গো শেল ওপেন করুনঃ

python manage.py shell

পাইথন ইন্টারএকটিভ শেল চালু হবে, সেখানে models.py তে তৈরি করা আমাদের Message মডেল (ক্লাস) ইম্পোর্ট করুনঃ

from myapp.models import Message

আমরা Message মডেল দিয়ে ডাটাবেইজ তৈরি করে ফেলেছি, এখন এই মডেল ব্যবহার করেই সেই ডাটাবেইজ এর অপারেশন গুলো করব। আমরা জানি যে এই মডেলটির প্যারেন্ট ক্লাস হল জ্যাঙ্গোর models.Model ক্লাস। এই মডেল ক্লাসটিই ডাটাবেইজ অপারেশনগুলো করার জন্য আমাদেরকে objects নামে একটা ম্যানেজার (এপিআই) দেয়। আমরা সেটা আমাদের Message ক্লাসে ব্যবহার করব।

প্রথমেই দেখা যাক ডাটাবেইজের সব ডাটা রিড করা যায় কিভাবে, লিখুনঃ

Message.objects.all()

Message ক্লাসের Obojects ম্যানেজার এর all() মেথডকে কল করলাম, এটা আমাদের ডাটাবেইজ কুয়েরি করে সকল ডাটা কুয়েরিসেট হিসেবে রিটার্ন করবে! উপরের কোড লিখে এন্টার করলে আপনি পরের লাইনে এরকম কিছু দেখতে পাবেনঃ

কুয়েরিসেট অবজেক্ট, একটা খালি লিস্ট! খালি থাকার কারণ হল আমরা এখনো ডাটাবেইজে কোন ডাটা রাখিনি। আসুন আগে কিছু ডাটা (মেসেজ আরকি) রাখি। ডাটা ক্রিয়েট করতে এই কমান্ডঃ

Message.objects.create(text=”Hi there! How are You!”)
Message.objects.create(text=”Have a nice day boy!”)
Message.objects.create(text=”Are you Crazy !”)

আমরা তিনটি মেসেজ বা ডাটা তৈরি করলাম, objects ম্যানেজারের create ফাংশন কল করে ডাটা ক্রিয়েট করেছি, ফাংশনের ভেতর কিওয়ার্ড আর্গুমেন্ট হিসেবে ডাটাবেইজের কলামের নাম এবং ফিল্ড ভ্যালু (সেই কলামের ডাটা যেটা হবে) দিয়েছি। এখন আমাদের ডাটাবেইজের Message টেবিলের text কলামে তিনটা ফিল্ড/রো যুক্ত হয়েছে, তিনটা মেসেজ!

এবার যদি আমরা Message.objects.all() কল করি তাহলে এরকম দেখবঃ

<QuerySet [<Message: Hi there! how are you!>, <Message: Have a nice day boy!>, <Message: Are you Crazy!>]>

কুয়েরিসেট লিস্ট, ভিতরে তিনটি আইটেম, আমাদের তিনটি মেসেজ!

Objects এর all() ফাংশনটি সকল আইটেম কুয়েরি করে বের করে। আমরা যদি নির্দিষ্ট কোন একটা আইটেম বের করতে চাই তাহলে get() ফাংশন ব্যবহার করতে পারিঃ

Message.objects.get(id=1)

আমাদের মডেলে যদিও আমরা শুধু text এট্রিবিউট বা কলাম রেখেছিলাম, কিন্তু জ্যাঙ্গো আমাদের জন্য ‘প্রাইমারি কি’ হিসেবে অতিরিক্ত আরেকটা এট্রিবিউট যোগ করে দিয়েছে id নামে। এটা করার কারন হল আমরা কোন ফিল্ডকে প্রাইমারি কি হিসেবে সেট করিনি, কিন্তু জ্যাঙ্গো ওআরএম প্রতিটি মডেলের মধ্যেই একটা ‘প্রাইমারি কি’ আশা করে।

যদিও অতিরিক্ত কলামটির নাম id তবে সেটাকে pk নামেও ডাকা যাবে। pk = Primary Key !

get() ফাংশনটিতে আমরা id=1 দিয়ে বলেছি যে সে যেন আমাদেরকে ঐ ফিল্ডটা রিটার্ন করে যার id এর ভ্যালু হল ১।

Message.objects.get(id=1) লিখলে রিটার্ন আসবেঃ

এবার কোন কুয়েরিসেট/লিস্ট আসেনি, বরং একটাই মাত্র অবজেক্ট! আমরা অবজেক্টটি থেকে আমাদের প্রয়োজন অনুযায়ী ফিল্ড ভ্যালু বের করে নিতে পারিঃ

mytext = Message.objects.get(id=1) mytext.text “Hi there! How are you!” mytext.id 1 mytext.pk 1

আমাদের মডেলে যদি আরো ফিল্ড থাকত তাহলে আমরা এভাবে সেগুলোর ভ্যালুও বের করতে পারতাম।

Obojects ম্যানেজারের আরেকটা বহুল ব্যবহৃত মেথড হল filter(), অনেক সময়ই আমাদেরকে নির্দিষ্ট কোন কন্ডিশনের উপর ভিত্তি করে ডাটাবেইজের ডাটা রিড করতে হয়। ফিল্টার মেথড আমাদেরকে সেই কাজটি করতে সাহায্য করেঃ

Message.objects.filter(id=1) ]>

ফিল্টারের মাধ্যমে আমরা বলে দিয়েছি যে ঐ ‘সকল’ অবজেক্ট গুলো বের কর যার আইডি হল ১, ফিল্টারটি একটা কুয়েরিসেট রিটার্ন করেছে এবং যেহেতু ডাটাবেইজে শুধুমাত্র একটি অবজেক্টের id এর মান 1 তাই এই কুয়েরিসেটের ভিতর মাত্র একটি ভ্যালু আছে!

এমন যদি হয় যে ফিল্টারের ভিতরের কন্ডিশনটা একাধিক অবজেক্টের সাথে ম্যাচ করে তাহলে সে সেই সবগুলো অবজেক্টই রিটার্ন করবেঃ

Message.objects.filter(text__icontains=’you’) , ]>

উপরোক্ত কোডে ফিল্টার করা হচ্ছে ঐ ‘সকল’ অবজেক্টকে যেগুলোর টেক্সট ফিল্ডে ‘you’ স্ট্রিং টি আছে। এটা দুটি অবজেক্টের একটি কুয়েরিসেট রিটার্ন করেছে, কেননা দুটি অবজেক্টের টেক্সট ফিল্ডে ‘you’ স্ট্রিং টি আছে!

মডেলের objects মেথড (কোন মডেলের objects মেথডকে আসলে ‘মডেল ম্যানেজার’ বলে) এর মাধ্যমে আমরা যেমন অবজেক্ট রিড করতে পারি, তেমন কোন অবজেক্ট ক্রিয়েট, আপডেট এবং ডিলেটও করতে পারি! এভাবেঃ

Message.objects.all().count() 3

প্রথমে count() মেথড দিয়ে চেক করে দেখলাম আমাদের মেসেজ মডেলে/টেবিলে কয়টি অবজেক্ট/ফিল্ড আছে! তিনটি আছে!

new_message = Message.obojects.create(text=’today is Friday’)

Objects ম্যানেজারের create() মেথড দিয়ে নতুন অবজেক্ট ক্রিয়েট করলাম, আর্গুমেন্ট হিসেবে text ফিল্ড এর ভ্যালু দিয়ে দিলাম! এবং অবজেক্টটিকে new_message ভেরিয়েবলে রাখলাম!

new_message

নতুন অবজেক্ট কল করে দেখলাম ক্রিয়েট হয়েছে কিনা! হয়েছে।

Message.objects.all().count() 4

আবার count() মেথড কল করে চেক করে দেখলাম টেবিলে এখন কয়টি ফিল্ড/অবজেক্ট আছে! এখন আছে চারটি! নতুন অবজেক্ট সহ!

new_message.text ’today is Friday’ new_message.id 4

নতুন অবজেক্টটির text ফিল্ড এর মান আমরা অবজেক্ট ক্রিয়েট করার সময় দিয়ে দিয়েছিলাম, এবং id ফিল্ডটা প্রাইমারি কি হিসেবে জ্যাঙ্গো অটোমেটিক তৈরি করে দিয়েছে!

new_message.text = ‘No, today is Sunday’) new_message.save()

আমরা পাইথনের ভেরিয়েবলে ভ্যালু এসাইন করার মতই text ফিল্ড এ নতুন ভ্যালু এসাইন করলাম। এবং এটা ডাটাবেইজে সেভ করার জন্য save() মেথড কল করলাম।

new_message.text ‘No, today is Sunday’

এখন আমার সেই অবজেক্ট এর text ফিল্ড কল করে দেখলাম তার ভ্যালুটা কি! সেখানে আপডেটেড ভ্যালুটা দেখা যাচ্ছে। তার মানে আমাদের ফিল্ড/অবজেক্টটা আপডেট হয়ে গেছে।

new_message.delete() (1, {‘myapp.Message’: 1})

উপ্‌স্‌! আমরা নতুন ক্রিয়েট করা অবজেক্টটা ডিলেট করে দিলাম!!

Message.objects.all().count() 3

অতঃপর আবার চেক করে দেখলাম আমাদের টেবিলে চারটা ফিল্ড থেকে একটা ডিলেট হয়ে এখন তিনটা ফিল্ড আছে!

জ্যাঙ্গো ওআরএম দিয়ে চাইলে আমরা আরো অনেক ধরনের কমপ্লেক্স কুয়েরি করতে পারি, আস্তে আস্তে সব শেখা হবে ইনশাল্লাহ।

মনে রাখবেনঃ জ্যাঙ্গো ওআরএম এ প্রতিটা মডেল হল ডাটাবেইজের একেকটা টেবিল, মডেলের ফিল্ডগুলো হল ডাটাবেইজের টেবিলের কলাম, মডেলের প্রতিটা ইন্সট্যান্স (মডেল থেকে তৈরি করা প্রতিটা অবজেক্ট) হল টেবিলের ফিল্ড বা ডাটা বা ‘রো’ !

জ্যাংগো Model এর Field অপশন নিয়ে বিস্তারিত জেনে নিই

আজকে আমাদের আলোচনার বিষয় হচ্ছে- জ্যাংগো Model এর Fields অপশন গুলো নিয়ে।

আসুন, জিনিসটা লাইভলি প্রাকটিস শুরু করি। এজন্য-

প্রথমে, এনভায়রনমেন্ট সেটাপ করে নেব।

– সিস্টেম ফাইল রেডি করে নিতে হবে। এজন্য- যে ফোল্ডারে এটা নিয়ে কাজ কারবার করব ঐ ফোল্ডার তৈরি করে ঐখানে(Django_All>temp) গিয়ে মাউসের রাইট ক্লিক অপশন থেকে git bash here দিব। এরপর পরপর যেসব কমান্ড prompt দেবঃ-

— এনভায়রনমেন্ট তৈরি/রেডি করতে কমান্ড দেব: python -m venv env

— ভার্চুয়াল এনভায়রনমেন্ট একটিভেট করতে কমান্ড দেব: source env/scripts/activate

— django install করতে কমান্ড দেব: pip install django

— এরপর, Projects ক্রিয়েট করব, কমান্ড দেব: django-admin startproject proj

এরপর, তৈরি করা প্রজেক্ট(proj) ফোল্ডারে ডুকব: cd proj

— এরপর- App তৈরি করব, কমান্ড দেব: python manage.py startapp blog

– এখন, একটা ডিরেক্টরি তৈরি করে নেব, কমান্ড দেব: mkdir templates

– এরপর, ঐ তৈরি করা ডিরেক্টরি(templates) তে ডুকব: cd templates

– এরপর, ঐখানে একটা html ফাইল তৈরি করে নেব, কমান্ড দেব: touch index.html

– এরপর, ঐ ফোল্ডার হতে বের হয়ে আগের proj ফোল্ডারে চলে যাব, কমান্ড দেবঃ cd..

– এরপর, আবার blog ফোল্ডারে ডুকব, কমান্ড দেব: cd blog

– এরপর, ঐখানে একটা urls.py ফাইল তৈরি করে নেব, কমান্ড দেব: touch urls.py

– এরপর, ঐ ফোল্ডার হতে বের হয়ে আগের proj ফোল্ডারে চলে যাব, কমান্ড দেব: cd..

– এখন, ওই ফোল্ডারে vscode টা ওপেন করে নেব, কমান্ড দেব: code.

এরপর vscode এ পরপর যেসব কাজ করব:-

 

এখন,

proj ফোল্ডারে settings.py ফাইল vscode এ ওপেন করে, সেখানে edit করে নেব:-

– ৩৩ নাম্বার লাইনে INSTALLED_APPS এর শেষে আমাদের পূর্বের তৈরি করা ‘blog’ এপস যুক্ত করে নেব।

– ৫৫ নাম্বার লাইনে TEMPLATS এ ‘DIRS’ = [], এর জায়গায় লিখতে হবে- ‘DIRS’ = [BASE_DIR /’templates’],

এখন,

proj ফোল্ডারে urls.py ফাইল vscode এ ওপেন করে, সেখানে edit করে নেব:-

– ১৭ নাম্বার লাইনে from django.urls import path, এর জায়গায় লিখব- from django.urls import path, include

– urlpatterns এ গিয়ে এরশেষে যুক্ত করে নেব: path(”, include(‘blog.urls’))

এখন,   (অনেকটা proj>urls.py ফাইলের মত)

blog ফোল্ডারে urls.py ফাইল এ ওপেন করে, সেখানে edit করে নেব:-

from django. urls import path
from . import views
urlpatterns = [
path('',views.home_view, name = 'home')
]

এখন,

blog ফোল্ডারে views.py ফাইল vscode এ ওপেন করে, সেখানে edit করে নেব:-

from django.shortcuts import render

def home_view(request):
return render(request, 'index.html', {})

এখন, temolates ফোল্ডারে touch index.html এ ওপেন করে, সেখানে edit করে নেব:-

<h1> Hello World </h1>

তো এখন, সার্ভার লোড করলে ব্রাউজারে Hello World শো করবে। এজন্য, সার্ভার লোডের জন্য টার্মিনালে কমান্ড দিই-

python manage.py runserver

তো এখন, environment সেটাপ হয়ে যাওয়ায় আমরা  মডেলের Fields অপশন গুলো নিয়ে কাজকারবার করতে পারব। 

### Field option in Django

মডেল হচ্ছে একটা class. models এর ভেতর ইচ্ছামত function তৈরি করে নিতে পারবেন, field option তৈরি করে নিতে পারবেন।

যেমন-

class Post(models.model):

categories_ref = [(‘G’, ‘General’), (‘O’, ‘Ordinary’)]

title = models.CharField(max_length=200, null=true, black=True)

content = models.TextField()

category = models.CharField(max_length=50, choices=categories_ref)

published = models.DateTimeField(auto_now_add=True)

modified = models.DateTimeField(auto_now=True)

এখানে কোডটির  জন্য Field optionসহ বিভিন্ন ব্যাপারস্যাপার এর ব্যাখ্যা:

এখানে, null=true হচ্ছে database এর সাথে সম্পর্কিত যা দ্বারা বুঝায় ডাটাবেজ ফাকা ভ্যালু accept করবে। আর,এ blank=True হচ্ছে Field এর সাথে রিলেটেড যা admin panel ইন্টারফেসে এ পোস্ট করার জন্য ব্যবহৃত হয়)

আর, সহজে বুঝানোর সুবিধার্থে ক্যাটাগরি ড্রপডাউন মেনু তৈরি করার categories_ref এর একটা সিস্টেম দেখানো হয়েছে, যেখানে G, O এগুলো ডাটাব্যাজে শো হবে, আর General, Ordinary এগুলা আউটপুটে শো হবে। যদিও পরে categories এর সুন্দর একটা সিস্টেম দেখানো হবে যা সমসময় ইউজ করব।

*** বিশেষ দ্রষ্টব্যঃ CharField, TextField ইত্যাদি এত্ত এত্ত fields অপশন মনে রাখার দরকার নাই। প্রয়োজন মত ইউজ করার জন্য model fields লিখে গুগলে সার্চ করলে ১ম সার্চ রেজাল্টের ওয়েবসাইটে সব types of fields পেয়ে যাবেন।

 

তো, বুঝা যাচ্ছে- বিভিন্ন ধরনের Field রয়েছে। যথা- 

  1. • কিছু Field রয়েছে যেগুলো সব ধরনের Field এর জন্য প্রযোজ্য।
  2. • আবার, কিছু Field রয়েছে যেগুলো সব নির্দিষ্ট কিছু Field এর জন্য প্রযোজ্য।

 

# (এর মধ্যে) কিছু fields অপশন নিয়ে আলোচনা:-

→ db_index এটা ব্যবহার করা হয় queryটাকে fast করার জন্য।

→ db_index এর সাথে সম্পর্কিত হচ্ছে tablespace যা filed index এর জন্য ব্যবহার করা হয়।

→ default : নির্দিষ্ট একটি ডাটা যেটা ডিফল্টভাবে বসে থাকবে।

→ editable :

→ error message নিয়ে কাজকারবার : error_messages = {‘Blank’:’here is an error’} এটা ও এটার মত কিছুক্ষেত্রে ইউজের আউটপুট দেখার সময় মাইগ্রেট করে নিতে হবে।

→ unique :

→ validators :

ইত্যাদি।

*** পরবর্তীতে প্রজেক্ট করার সময় আমরা বিভিন্ন Field এর ব্যবহার দেখবো।

বি:দ্র: পাইথনে যখন-ই database এর সাথে সম্পর্কিত যেমন- models এর কোনো কিছু আপডেট বা যুক্ত/বাদ দেওয়া হবে তখন প্রতিবার-ই টার্মিনালে তিনটা কাজ করতে হয়(লিখে enter press করতে হবে):-
• python manage.py makemigrations
• python manage.py migrate
(((আর, মনে রাখব- যেকোনো models এ একদম ১মবার superuser  তৈরি করে নিতে হয়, যদি তা করা না হয়ে থাকে তবে অবশ্যই তৈরি করে নেবে।
• python manage.py createsuperuser [ইউজার, পাসওয়ার্ড দিতে হবে, email আপাদত না দিলেও সমস্যা নাই])))
• python manage.py runserver
এবার, localhost:8000/admin এ গিয়ে admin panel এ লগিন করব।

এখনো, admin এ post এর কিছু শো করবে না, শো করার জন্য blog>admin.py তে গিয়ে পূর্বের লাইনটির পাশাপাশি বাড়তি যে লাইন দুটি লিখে register করে নিতে হবে তা হল:-

from .models import POST
admin.site.register(POST)

এখন, ওয়েবপেজটা reload দিলেই post অপশন দেখতে পাব।

(Django admin dashboard সাজানো)- Auto Populate Slug Field & Models Field Reference:

slug এর জন্য আমরা ব্যাসিক যে মডেল তৈরি করেছিলাম সেটার সমস্যা হচ্ছে slug field টা ম্যানুয়ালি দিতে হচ্ছে।
এটা অটোমেটিক জেনারেট হচ্ছে না, আবার blankও রাখা যাচ্ছে না।
এটা সমাধানের জন্য যা করতে হয়েছে-
unique=True, null=True, blank=True
তাছাড়া, utils লিখে গুগল সার্চ করলে বিভিন্ন ফাংশন পাওয়া যাবে। তার মধ্যে slugify দিয়ে এ কাজটা সম্পন্ন হবে।

#
প্রথমে, blog>admin.py ফাইল edit করে যা লিখব:-

from django.contrib import admin
from .models import *

admin.site.register(Post)
admin.site.register(Category)
admin.site.register(Tags)

বিঃদ্রঃ অবশ্যই মনে করে (নিচের) models.py এর জন্য (উপরের) admin.py এ codeটা যুক্ত করে নিতে হবে।

#
এরপর, blog>models.py ফাইল edit করে যা লিখব:-

from django.db import models
from django.utils.text import slugify

class Tags(models.Model):
    title=models.CharField(max_length=200)
    slug = models.SlugField(max_length=150, unique=True, null=True, blank=True)

    def_str_(self):
        return self.title

class Category(models.Model):
    title=models.CharField(max_length=200)
    slug = models.SlugField(max_length=150, unique=True, null=True, blank=True)

    def_str_(self):
        return self.title

    def save(self, *args, **kwargs)
        self.slug=slugify(self.title)
    super().save(*args, **kwargs)

class Post(models.Model):
   title = models.CharField(max_lenght=150)
    slug = models.SlugField(max_length=150, unique=True, null=True, blank=True)
    content = models.TextField(blank=True, null=True)
    category = models.ForeignKey(Category)
    post_status = models.IntegerField(choices=status, default=0)
    created = models.DateTimeField(‌‌‌auto_new_add=True)
    modified = models.DateTimeField(‌‌‌auto_new_add=True)

Slug টা যদি ডবল হয়ে যায় তাহলে এরর আসতে পারে। তখন, Integrity Error আসবে, আর সেটা দুইভাবে সলভ করা যায়। (১) while loop(try, except) দিয়ে (২) আরো একভাবে করা যায় যা আমরা আরো পরে দেখাবো।

——

এখানে, যে field গুলোর ব্যবহার দেখেছি:-

আরো একটি filed এর ব্যবহার দেখে নিই : help_text  :

help_text=”Enter Your Post Title Here”

Choice

editable

এটা যদি False করা থাকে, তাহলে fieldটা edit করা যাবে. ডিফল্টভাবে এটা True করা থাকে।

—-

Django Model field reference– Relationship Field(ForeignKey) ও Many to Many Relationship :

admin সেকশনে আমরা post ও category তৈরি করেছি। কিন্তু কথা হচ্ছে এই দুইটার মধ্যে relation(সম্পর্ক)টা কি?
তো, কোনো একটা postকে কোন category তে ফেলব সেটার relation(সম্পর্ক) তৈরি করার জন্য যা করব-

blog>admin.py তে গিয়ে edit করে নেব:-
category = models.ForeignKey

ForeignKey নিয়ে ব্যাখ্যাঃ-
এটা একটা Relationship Field.
ForeignKey টা হচ্ছে many to one relationship. এরকম আরেকটি হচ্ছে:- many to many relationship, যেটা tag এর ক্ষেত্রে ব্যবহার করা হয়।
এর ফর্মুলা হচ্ছে-

classForeignKey(to, on_delete, options)

এখানে,
to দ্বারা বুঝাচ্ছে কিসের সাথে রিলেশন তৈরি হবে,
on_delete দ্বারা বুঝাচ্ছে যে জিনিসের সাথে রিলেশন তৈরি হয়েছে ঐ জিনিসটা ডিলিট করা হয় তখন কি করা সেটা।
এর উদাহরণ হচ্ছে-

category = models.ForeignKey(Category, on_delete=models.SET_NULL)

Implementation of django reference object: অপশনগুলো-
CASCADE: যখন আপনি blog post টা রিমুভ করবেন, তখন তার অধীনে যে কমেন্টগুলা থাকবে সেগুলো ডিলিট হবে.
এরকম আরো কিছু Model field reference:
PROTECT: রেফারেন্স objectটা ডিলিট করবে না,
RESTRICT: এটা PROTECT এর মত একইভাবে কাজ করে।
SET_NULL: এটা blank করে দেবে।

Tag এর জন্য blog>admin.py তে আলাদা একটি option পার্ট তৈরি করে নিই-

many to many relationship, যেটা tag এর ক্ষেত্রে ব্যবহার করা হয়।

এর ফর্মুলা হচ্ছে-

classManyToManyField(to, **options)

এখানে,
on_delete অপশনটি ইউজ করতে হয় না।
এর উদাহরণ হচ্ছে-

category = models.ManyToManyField(Category,=models.SET_NULL)

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *