Django Meta ক্লাসে constraints নিয়ে বিশদ টিউটোরিয়াল
ভূমিকা:
Django মডেলের Meta ক্লাসের constraints বৈশিষ্ট্যটি ডেটাবেস স্তরে ভ্যালিডেশন করার সুযোগ দেয়। এটি সাধারণত ডেটার ইনটিগ্রিটি নিশ্চিত করার জন্য ব্যবহার করা হয়, যেখানে SQL কনস্ট্রেইন্টের মাধ্যমে ডেটাবেস স্তরে নির্দিষ্ট শর্তগুলো প্রয়োগ করা হয়।
এই টিউটোরিয়ালে আমরা বিভিন্ন ধরনের কনস্ট্রেইন্ট নিয়ে আলোচনা করব এবং বিভিন্ন বাস্তব উদাহরণ দেখাবো।
constraints এর প্রকারভেদ
Django তে বিভিন্ন ধরনের কনস্ট্রেইন্ট ব্যবহার করা যায়, যেমন:
CheckConstraint: এটি ফিল্ডের মানের উপর নির্দিষ্ট শর্ত প্রয়োগ করে।UniqueConstraint: এটি ফিল্ডের মান ইউনিক হওয়ার নিশ্চয়তা দেয়।ForeignKeyConstraints: এটি ফোরেন কি সম্পর্কিত কনস্ট্রেইন্ট।PrimaryKeyConstraints: এটি প্রাইমারি কি নিশ্চিত করতে ব্যবহার করা হয়।
১. CheckConstraint ব্যবহার:
CheckConstraint ব্যবহার করে আপনি নির্দিষ্ট শর্তে ডেটা এন্ট্রি করতে পারবেন। যেমন কোনো ফিল্ডের মান শূন্যের উপরে বা কোনো নির্দিষ্ট সীমার মধ্যে রাখতে চাইলে এটি ব্যবহার করা হয়।
উদাহরণ ১: বেতন শূন্যের চেয়ে বেশি হতে হবে
from django.db import models
class Employee(models.Model):
name = models.CharField(max_length=100)
salary = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
constraints = [
models.CheckConstraint(check=models.Q(salary__gt=0), name='salary_gt_0')
]
def __str__(self):
return self.name
এই উদাহরণে:
- এখানে
Employeeমডেলেsalaryএর জন্যCheckConstraintপ্রয়োগ করা হয়েছে, যা নিশ্চিত করছে যে বেতন শূন্যের বেশি হতে হবে। - যদি কেউ শূন্য বা এর চেয়ে কম বেতন দিয়ে এন্ট্রি করার চেষ্টা করে, তাহলে Django তা অনুমোদন করবে না।
ব্যবহার:
>>> emp = Employee(name="John Doe", salary=-1000)
>>> emp.save() # এখানে Save করার চেষ্টা করলে ValidationError উঠবে কারণ salary_gt_0 কনস্ট্রেইন্ট ভঙ্গ হয়েছে।
২. UniqueConstraint ব্যবহার:
UniqueConstraint ব্যবহার করে এক বা একাধিক ফিল্ডের ইউনিক মান নিশ্চিত করা যায়।
উদাহরণ ২: ইমেইল এবং ইউজারনেম ইউনিক হওয়া
class User(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField()
class Meta:
constraints = [
models.UniqueConstraint(fields=['username', 'email'], name='unique_user_email')
]
def __str__(self):
return self.username
এই উদাহরণে:
usernameএবংemailফিল্ডের জন্য একটি ইউনিক কনস্ট্রেইন্ট দেওয়া হয়েছে, যাতে একই ইমেইল ও ইউজারনেম একাধিকবার ব্যবহার করা না যায়।UniqueConstraintব্যবহার করে একাধিক ফিল্ডের উপর ভিত্তি করে ইউনিক কনস্ট্রেইন্ট আরোপ করা হয়েছে।
ব্যবহার:
>>> user1 = User(username="john_doe", email="john@example.com")
>>> user1.save()
>>> user2 = User(username="john_doe", email="john@example.com")
>>> user2.save() # এখানে Duplicate entry এর কারণে ValidationError উঠবে।
৩. শর্তযুক্ত CheckConstraint:
এখন আমরা এমন একটি উদাহরণ দেখব যেখানে একাধিক শর্তের উপর ভিত্তি করে CheckConstraint প্রয়োগ করা হবে।
উদাহরণ ৩: বোনাস বেতনের ২০% এর বেশি নয়
class Employee(models.Model):
name = models.CharField(max_length=100)
salary = models.DecimalField(max_digits=10, decimal_places=2)
bonus = models.DecimalField(max_digits=10, decimal_places=2)
class Meta:
constraints = [
models.CheckConstraint(check=models.Q(bonus__lte=models.F('salary') * 0.2), name='bonus_lte_20_percent')
]
def __str__(self):
return self.name
এই উদাহরণে:
- এখানে একটি কনস্ট্রেইন্ট তৈরি করা হয়েছে যাতে বোনাস বেতনের ২০% এর বেশি না হয়।
- আমরা
models.F('salary')এর মাধ্যমে ডায়নামিক্যালি বোনাসের সীমা চেক করছি।
ব্যবহার:
>>> emp = Employee(name="Jane Doe", salary=1000, bonus=250)
>>> emp.save() # এখানে ValidationError উঠবে কারণ বোনাস বেতনের ২০% এর বেশি হয়েছে।
৪. UniqueConstraint এবং CheckConstraint একত্রে ব্যবহার:
কখনও কখনও একাধিক কনস্ট্রেইন্ট একত্রে ব্যবহার করা হতে পারে। নিচের উদাহরণে আমরা দুটি কনস্ট্রেইন্ট ব্যবহার করেছি।
উদাহরণ ৪: ইউনিক নাম এবং পজিটিভ সংখ্যক কর্মচারী
class Department(models.Model):
name = models.CharField(max_length=100, unique=True)
employee_count = models.IntegerField()
class Meta:
constraints = [
models.CheckConstraint(check=models.Q(employee_count__gte=0), name='employee_count_positive'),
models.UniqueConstraint(fields=['name'], name='unique_department_name')
]
def __str__(self):
return self.name
এই উদাহরণে:
employee_countফিল্ডের জন্য পজিটিভ মান চেক করার কনস্ট্রেইন্ট যোগ করা হয়েছে।- পাশাপাশি
nameফিল্ডের জন্য ইউনিক কনস্ট্রেইন্ট দেয়া হয়েছে যাতে বিভাগগুলোর নাম ইউনিক হয়।
ব্যবহার:
>>> dept = Department(name="HR", employee_count=-5)
>>> dept.save() # ValidationError উঠবে কারণ employee_count পজিটিভ নয়।
৫. ForeignKeyConstraint এবং PrimaryKeyConstraint
আপনি ফোরেন কি এবং প্রাইমারি কি নিয়েও কনস্ট্রেইন্ট দিতে পারেন, যদিও Django ডিফল্টভাবে এই কনস্ট্রেইন্টগুলো সরবরাহ করে। আপনি চাইলে ডায়নামিক ভাবে ফোরেন কি এর উপর ভিত্তি করে কনস্ট্রেইন্ট ব্যবহার করতে পারেন।
উদাহরণ ৫: ফোরেন কি সম্পর্কিত কনস্ট্রেইন্ট
class Subscription(models.Model):
name = models.CharField(max_length=100)
class Company(models.Model):
name = models.CharField(max_length=100)
subscription = models.ForeignKey(Subscription, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=['name', 'subscription'], name='unique_company_subscription')
]
def __str__(self):
return self.name
এই উদাহরণে:
- এখানে
CompanyএবংSubscriptionএর মধ্যে একটিForeignKeyConstraintতৈরি করা হয়েছে। একই কোম্পানি একাধিক সাবস্ক্রিপশন প্ল্যানে থাকতে পারবে না।
সারসংক্ষেপ:
Django তে Meta ক্লাসের constraints ব্যবহার করে আমরা ডেটাবেস স্তরে ডেটার ইনটিগ্রিটি রক্ষা করতে পারি।
CheckConstraint: নির্দিষ্ট শর্ত প্রয়োগ করে।UniqueConstraint: ফিল্ডের মান ইউনিক হওয়া নিশ্চিত করে।- সংযুক্ত কনস্ট্রেইন্ট: আপনি একাধিক কনস্ট্রেইন্ট একত্রে ব্যবহার করতে পারেন।
constraintsব্যবহার করে আমরা সহজেই মডেল স্তরে ভ্যালিডেশন লজিক প্রয়োগ করতে পারি যা ডেটার সঠিকতা এবং ইনটিগ্রিটি নিশ্চিত করে।
এখন আপনি Django তে Meta ক্লাসের constraints কিভাবে ব্যবহার করতে হয়, তা প্রফেশনাল ভাবে বুঝতে পারলেন এবং প্রয়োগ করতে পারবেন!