Django Projects
Create an Inventory Management System With Python and Django in Bangla Part-3: Create Django Inventory Models
আজকের পর্বে আমরা দেখব আমাদের Django Inventory Management System এর জন্য কিভাবে ডেটাবেস Model গুলি ডিফাইন করতে হয়৷ তবে তার আগে আমরা জানব , Django তে Model কী, এটি কীভাবে ঘোষণা করা হয় এবং Django তে Model এর কিছু main field type গুলো সম্পর্কে জানব।
Django তে Model কি?
Django Framework এ Model এর কাজ হচ্ছে Database সংশ্লিষ্ঠ কাজ গুলো করা। MVC ভিত্তিক যেকোনো software অথবা Web Application এর সমস্ত Database সংশ্লিষ্ঠ কাজ গুলো রাখা হয় Model নামক একটি class এ । এবং পরবর্তীতে এই Model Class টি Inherit করার মাধ্যমে আমরা আমাদের প্রয়োজনীয় নতুন নতুন Model Class তৈরী করতে পারি।
মূলতঃ মডেলগুলি আপনার Application এর সংরক্ষিত ডেটার স্ট্রাকচার ডিফাইন করে, যার মধ্যে field types এবং Field গুলোর maximum size, default values, selection list options,ডেটার ডকুমেন্টেশন এর জন্য help text , ফর্মগুলির জন্য Level Text ইত্যাদি।
Django Model আপনাকে আপনার কাজে দারুন স্বাধীনতা দেয় । একবার আপনি কোন ডেটাবেসের জন্য যদি একটি Model ডিফাইন করেন , আপনাকে আর খুব বেশি কাজ করার দরকার হবে না — আপনি কেবল আপনার model structure এবং অন্যান্য কোড লিখুন এবং জ্যাঙ্গো আপনার জন্য ডাটাবেসের সাথে যোগাযোগের সমস্ত জটিল এবং বিরক্তিকর কাজগুলো করে দিবে।
Create a Super User in Django Admin
প্রথমে আপনাকে Django Framework এর admin (http://localhost:8000/admin/) এ এক্সেস এর জন্য প্রয়োজনীয় table গুলো তৈরির জন্য নিম্নোক্ত কমান্ডের মাধ্যমে Migrate এর কাজটি করতে হবে :
python manage.py migrate
এখন আপনি ঠিক নিচের মতো একটি স্ক্রিন দেখতে পাবেন :
যদি সবগুলো Table Successfully Migrate হয় , তাহলে নিম্নোক্ত কমান্ডের মাধ্যমে Django Admin Access এর জন্য একটি super user তৈরি করে নিতে হবে।
python manage.py createsuperuser
যদি Successfully User তৈরি হয় , তাহলে আপনাকে একটি success message দিবে:
এবার আপনি সহজেই আপনার তৈরি Username এবং Password দিয়ে Django Admin Panel এ একসেস করতে পারবেন :
Create Category Model
প্রথমে আমরা আমাদের Product এর Category গুলোকে Manage করার জন্য একটি Category Model তৈরি করতে হবে।
আর যেহেতু Inventory Management System এর মতো সিস্টেমের Category এবং Sub Category এর কোনো শেষ নাই তাই আমরা Django MPTT app এর সাহায্য নিব।তার আগে জেনে নেওয়া যাক Django MPTT কি?
Django MPTT (Modified Pre-order Tree Traversal) একটি third-party app যা আপনাকে একটি জ্যাঙ্গো মডেলের বিভাগগুলির মধ্যে hierarchical relationships তৈরি এবং ম্যানেজ করতে দেয়। সহজ কোথায় Django MPTT ব্যবহার করে আপনি যেকোনো ধরণের category tree তৈরি করতে পারবেন।
প্রথমে নিম্নোক্ত কমান্ডের মাধ্যমে Django MPTT app টি ইনস্টল করে করে নিন:
pip install django-mptt
Register your newly created mptt App
এবার আপনার inventory/inventory ফোল্ডারের মধ্যে অবস্থিত settings.py ফাইলে “INSTALLED_APPS” section এর অধীনে আমাদের সদ্য তৈরি করা mptt apps কে রেজিস্ট্রি করার জন্য নিম্নোক্ত লাইনটি যুক্ত করে দিন।
'mptt',
এবার আমরা dashboard ফোল্ডারের মধ্যে models.py ফাইলে Category table এবং তার name field তৈরির জন্য নিম্নোক্ত কোড গুলো লিখব :
from mptt.models import MPTTModel, TreeForeignKey from django.contrib.auth.models import User from django.db import models # Create your models here. class Category(MPTTModel): name = models.CharField(max_length=50, unique=True) parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') class MPTTMeta: order_insertion_by = ['name'] class Meta: verbose_name_plural="Category" def __str__(self): return self.name
Registering Category Model
এবার এই Category Model কে dashboard ফোল্ডারের মধ্যে অবস্থিত admin.py ফাইলে নিম্নোক্ত কোড গুলো দিয়ে registry করে দিবো।
from django.contrib import admin from . models import Category admin.site.site_header="My Inventory Dashboard" # Register your models here. admin.site.register(Category)
Make Migration
এবার এই Category Model এর জন্য একটি Migration File তৈরি করব , এর জন্য আপনাকে নিম্নোক্ত কম্যান্ড এক্সেকিউট করতে হবে:
python manage.py makemigrations python manage.py migrate
এখন dashboard এ আপনার category model টি হবে নিম্নরূপ :
Create Product Model
এবার আমরা আমাদের Product গুলোকে Manage করার জন্য একটি Product Model তৈরি করতে হবে। এর জন্য আমরা dashboard ফোল্ডারের মধ্যে models.py ফাইলে product table এবং তার field গুলো তৈরির জন্য নিম্নোক্ত কোড গুলো ঠিক category model এর নিচেই লিখব :
class Product(models.Model): name = models.CharField(max_length=100, null=True) quantity = models.PositiveIntegerField(null=True) category = models.ForeignKey(Category, on_delete=models.CASCADE,null=True) class Meta: verbose_name_plural="Product" def __str__(self): return f'{self.name}-{self.quantity}'
ব্যাখ্যা:
- লাইন নম্বর ১২ থেকে ১৫ এর মধ্যে আমরা আমাদের products table এর স্ট্রাকচার তৈরি করেছি।
- লাইন নম্বর ৫-৯ এ default category গুলোকে ইনসার্ট এর কাজ করেছি।
- লাইন নম্বর ১৭ এবং ১৮ এ তে Dashboard List এর মধ্যে Products অবজেক্ট টি কে plural থেকে Singular (product) এ রূপান্তর করেছি।
- লাইন নম্বর ২০ এবং ২১ এক Product List এর মধ্যে প্রতিটি প্রোডাক্ট নাম এর শেষে যেই ইউজার অর্ডারটি করেছে তার নাম দেখানো হবে।
Registering Product
এবার এই Product Model কে category model এর মতোই কিছু বাড়তি সুবিধা সহ dashboard ফোল্ডারের মধ্যে অবস্থিত admin.py ফাইলে নিম্নোক্ত কোড গুলো দিয়ে registry করে দিবো।
from django.contrib import admin from . models import Category,Product admin.site.site_header="My Inventory Dashboard" class ProductAdmin(admin.ModelAdmin): list_display=('name','category','quantity') list_filter=['category'] list_editable=['quantity'] # Register your models here. admin.site.register(Category) admin.site.register(Product,ProductAdmin)
ব্যাখ্যা:
- লাইন নম্বর ২ এ আমরা Product Model টি import করেছি।
- লাইন নম্বর ৬ থেকে ৯ নম্বর লাইনে এ কোন কোন ফিল্ড গুলো প্রোডাক্ট লিস্টে প্রদর্শন করব, কোন কোন ফিল্ড এর ভিত্তিতে ফিল্টার হবে এবং কোন কোন ফিল্ড ইনলাইন এডিট হবে সেটা নির্ধারণ করেছি।
- লাইন নম্বর ১১ এবং ১২ এর কাজ একই। আপনি যদি শুধু প্রথম ফিল্ড টি প্রোডাক্ট লিস্টে প্রদর্শন করতে চান , তাহলে আপনাকে ১১ নম্বর লাইন কে একটিভ রাখতে হবে , এক্ষেত্রে আপনাকে ৬ থেকে ৯ নম্বর লাইনের কোড লেখার দরকার হবেনা। আর যদি একাধিক ফিল্ড কে আপনি আপনার ইচ্ছা মতো Product List এ প্রদর্শন করতে চান, তাহলে আপনাকে ১২ নম্বর লাইন টি এবং ৬ থেকে ৯ নম্বর লাইন একটিভ রাখতে হবে।
এবার এই Product Model এর জন্য একটি Migration File তৈরি করব , এর জন্য আপনাকে নিম্নোক্ত কম্যান্ড এক্সেকিউট করতে হবে:
python manage.py makemigrations python manage.py migrate
এখন আপনার dashboard এ নতুন Product Model টি দেখতে হবে ঠিক নিম্নরুপঃ
Create Order Model and Create Relation with Product and User Model
এখন আমরা আমাদের Orders গুলোকে Manage করার জন্য একটি Order Model তৈরি করতে হবে একইসাথে Product এবং User Model এর সাথে Relation তৈরি করতে হবে। এর জন্য আমরা dashboard ফোল্ডারের মধ্যে models.py ফাইলে order table এবং তার field গুলো তৈরি একইসাথে Product এবং User Model এর সাথে Relation তৈরির জন্য নিম্নোক্ত কোড গুলো লিখব :
class Order(models.Model): product=models.ForeignKey(Product,on_delete=models.CASCADE,null=True) staff=models.ForeignKey(User,models.CASCADE,null=True) order_quantity=models.PositiveIntegerField(null=True) data=models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural="Order" def __str__(self): return f'{self.product} ordered by {self.staff.username}'
ব্যাখ্যা:
- লাইন নম্বর ২এবং 3 এ আমরা products, users টেবিল এর সাথে রিলেশন বিল্ড করছি।
- এছাড়া on_delete=models.CASCADE দিয়ে আমরা কোনো প্রোডাক্ট ডিলিট হওয়ার সাথে সেই প্রোডাক্টের অর্ডার ও যেন ডিলেট হয়, সেটার ব্যবস্থা করেছি।
ফাইনালি আপনার models.py ফাইলের কোডগুলো হবে নিম্নরূপ:
from mptt.models import MPTTModel, TreeForeignKey from django.contrib.auth.models import User from django.db import models # Create your models here. class Category(MPTTModel): name = models.CharField(max_length=50, unique=True) parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') class MPTTMeta: order_insertion_by = ['name'] class Meta: verbose_name_plural="Category" def __str__(self): return self.name class Product(models.Model): name = models.CharField(max_length=100, null=True) quantity = models.PositiveIntegerField(null=True) category = models.ForeignKey(Category, on_delete=models.CASCADE,null=True) class Meta: verbose_name_plural="Product" def __str__(self): return f'{self.name}-{self.quantity}' class Order(models.Model): product=models.ForeignKey(Product,on_delete=models.CASCADE,null=True) staff=models.ForeignKey(User,models.CASCADE,null=True) order_quantity=models.PositiveIntegerField(null=True) data=models.DateTimeField(auto_now_add=True) class Meta: verbose_name_plural="Order" def __str__(self): return f'{self.product} ordered by {self.staff.username}'
এবার এই Order Model কে dashboard ফোল্ডারের মধ্যে অবস্থিত admin.py ফাইলে Product এবং Category Model এর মতোই নিম্নোক্ত কোড দিয়ে registry করে দিবো।
from django.contrib import admin from . models import Category,Product,Order admin.site.site_header="My Inventory Dashboard" class ProductAdmin(admin.ModelAdmin): list_display=('name','category','quantity') list_filter=['category'] list_editable=['quantity'] # Register your models here. #admin.site.register(Product) admin.site.register(Product,ProductAdmin) admin.site.register(Order) admin.site.register(Category)
ফাইনালি আপনার admin.py ফাইলের কোডগুলো হবে নিম্নরূপ:
from django.contrib import admin from mptt.admin import DraggableMPTTAdmin from . models import Category,Product,Order admin.site.site_header="My Inventory Dashboard" class ProductAdmin(admin.ModelAdmin): list_display=('name','category','quantity') list_filter=['category'] list_editable=['quantity'] class CategoryAdmin(DraggableMPTTAdmin): mptt_indent_field = "name" list_display = ('tree_actions', 'indented_title') list_display_links = ('indented_title',) mptt_level_indent = 15 # Register your models here. admin.site.register(Product,ProductAdmin) admin.site.register(Order) admin.site.register(Category,CategoryAdmin)
এবার এই Order Model এর জন্য একটি Migration File তৈরি করব , এর জন্য আপনাকে নিম্নোক্ত কম্যান্ড এক্সেকিউট করতে হবে:
python manage.py makemigrations
এখন আপনি dashboard ফোল্ডারের মধ্যে 0002_order.py নামে মাইগ্রেশন ফাইল তৈরি হবে । এবং এর কোড গুলো হবে নিম্নরূপ:
# Generated by Django 4.1.5 on 2023-01-15 11:03 from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('dashboard', '0001_initial'), ] operations = [ migrations.CreateModel( name='Order', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order_quantity', models.PositiveIntegerField(null=True)), ('data', models.DateTimeField(auto_now_add=True)), ('product', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='dashboard.product')), ('staff', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), ]
এবার আমাকে উক্ত migration File টি কে রান করার জন্য নতুন একটি Migration command রান করতে হবে :
python manage.py migrate
এবার নিম্নোক্ত কমান্ডের মাধ্যমে সার্ভারটি রান করুন:
python manage.py runserver
এখন আপনার dashboard এ নতুন Order Model টি সহ সবগুলো মডেল দেখতে হবে ঠিক নিম্নরুপঃ