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

এখন আপনি ঠিক নিচের মতো একটি স্ক্রিন দেখতে পাবেন :

Django Framework Migrate
Django Framework Migrate

যদি সবগুলো Table Successfully Migrate হয় , তাহলে নিম্নোক্ত কমান্ডের মাধ্যমে Django Admin Access এর জন্য একটি super user তৈরি করে নিতে হবে।

python manage.py createsuperuser

যদি Successfully User তৈরি হয় , তাহলে আপনাকে একটি success message দিবে:

Django Admin Super User Create
Django Admin Super User Create

এবার আপনি সহজেই আপনার তৈরি Username এবং Password দিয়ে Django Admin Panel এ একসেস করতে পারবেন :

Django Admin Panel
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 Category Tree for Django Inventory
Create Category Tree for Django Inventory

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 টি দেখতে হবে ঠিক নিম্নরুপঃ

Django Inventory Dashboard Add Product Model Design
Django Inventory Dashboard Add Product Model Design
Django Inventory Product List Display
Django Inventory Product List Display

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 টি সহ সবগুলো মডেল দেখতে হবে ঠিক নিম্নরুপঃ

Django Category and Product Models
Django Category and Product Models

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply