ভূমিকা
Django তে মডেল ডেটা ভ্যালিডেশন এবং সঠিকভাবে ডেটা সংরক্ষণের জন্য clean() এবং full_clean() মেথডগুলো গুরুত্বপূর্ণ ভূমিকা পালন করে। এই মেথডগুলো ব্যবহার করে আমরা মডেলের ফিল্ড ভ্যালিডেশন এবং কাস্টম লজিক চেক করতে পারি।
এই টিউটোরিয়ালে আমরা clean() এবং full_clean() কীভাবে কাজ করে তা উদাহরণ সহ আলোচনা করব।
১. clean() মেথড
clean() মেথডটি Django মডেলের জন্য একটি কাস্টম ভ্যালিডেশন মেথড। এটি ব্যবহার করা হয় মডেলের কাস্টম ভ্যালিডেশন লজিক প্রয়োগ করতে। যখন কোনো মডেল সেভ করা হয়, আমরা চাইলে কিছু নির্দিষ্ট শর্ত চেক করে মডেল ভ্যালিডেশন করতে পারি।
উদাহরণ:
from django.core.exceptions import ValidationError
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
discount_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
# clean method for custom validation
def clean(self):
# প্রথমে superclass এর clean মেথডটি কল করা হয়
super().clean()
# দাম চেক করা হচ্ছে
if self.discount_price and self.discount_price > self.price:
raise ValidationError("Discount price cannot be greater than the actual price.")
def __str__(self):
return self.name
এই উদাহরণে কি হচ্ছে:
- এখানে একটি
Productমডেল আছে, যেখানেpriceএবংdiscount_priceফিল্ড রয়েছে। clean()মেথডটি ব্যবহার করে আমরা যাচাই করছি যে, ডিসকাউন্টের দাম (discount_price) মূল দাম (price) এর চেয়ে বেশি না হয়।
ব্যবহার:
>>> product = Product(name="Laptop", price=500.00, discount_price=600.00)
>>> product.full_clean() # এটি ভ্যালিডেশন করবে এবং ValidationError দিবে
২. full_clean() মেথড
full_clean() মেথডটি পুরো মডেলের ভ্যালিডেশন চেক করার জন্য ব্যবহৃত হয়। এটি তিনটি পর্যায়ে কাজ করে:
- Field validation: ফিল্ডের নির্ধারিত ভ্যালিডেশন যেমন
max_length,validatorsইত্যাদি চেক করে। - Model validation: মডেল লেভেলের কাস্টম ভ্যালিডেশন (
clean()মেথড) চেক করে। - Unique constraint validation: মডেলের
uniqueফিল্ডগুলো চেক করে ডুপ্লিকেট ডেটা এন্ট্রি হওয়ার সুযোগ বন্ধ করে।
উদাহরণ:
class Employee(models.Model):
name = models.CharField(max_length=100, unique=True)
salary = models.DecimalField(max_digits=10, decimal_places=2)
bonus = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
def clean(self):
super().clean()
if self.bonus and self.bonus > self.salary * 0.50:
raise ValidationError("Bonus cannot be more than 50% of the salary.")
def save(self, *args, **kwargs):
self.full_clean() # Save করার আগে পুরো ভ্যালিডেশন করবে
super().save(*args, **kwargs)
এই উদাহরণে কি হচ্ছে:
Employeeমডেলে একটি কাস্টম ভ্যালিডেশন যোগ করা হয়েছে যা বোনাস (bonus) মোট বেতনের (salary) ৫০% এর বেশি হতে পারবে না।save()মেথডেfull_clean()যোগ করা হয়েছে যাতেsaveকরার আগেই সম্পূর্ণ ভ্যালিডেশন চেক করা হয়।
ব্যবহার:
>>> emp = Employee(name="John", salary=1000.00, bonus=600.00)
>>> emp.full_clean() # এটা ValidationError দিবে কারণ বোনাস বেতনের ৫০% এর বেশি
৩. clean() এবং full_clean() এর ব্যবহারিক দিক
clean()মডেলটির লজিক্যাল ভ্যালিডেশন করার জন্য ব্যবহার করা হয়, যেখানে ফিল্ডগুলোর মধ্যে সম্পর্ক নির্ণয় করা হয়।full_clean()মূলত পুরো মডেল, এর ফিল্ড, এবং ইউনিক ভ্যালিডেশন চেক করার জন্য ব্যবহার করা হয়।save()মেথডের আগেfull_clean()ব্যবহার করার মাধ্যমে সঠিক এবং পরিপূর্ণ ভ্যালিডেশন নিশ্চিত করা হয়।
৪. মডেল ভ্যালিডেশন সেভ করার সময়
যখন আপনি save() মেথড কল করবেন, তখন যদি আপনি full_clean() না ব্যবহার করেন, তাহলে মডেলটি ভ্যালিডেশন পাস না করেও ডাটাবেসে সেভ হয়ে যাবে। এজন্য সর্বদা full_clean() মেথড save() এর আগে কল করা উচিত।
উদাহরণ:
>>> emp = Employee(name="Doe", salary=5000, bonus=3000)
>>> emp.save() # এটা সেভ হয়ে যাবে কারণ full_clean() কল করা হয়নি
# কিন্তু,
>>> emp.full_clean() # এটা ভ্যালিডেশন চেক করবে এবং ValidationError দিবে
# তাই সঠিকভাবে ব্যবহার করুন:
>>> emp.save() # full_clean() মেথড save এর আগে কল করা হলে মডেল সেভ হওয়ার আগে ভ্যালিডেশন চেক করবে
৫. Meta এর validate_constraints:
আপনি মডেলের ভেতরে Meta ক্লাসে constraints ব্যবহার করে SQL স্তরে কাস্টম ভ্যালিডেশন যোগ করতে পারেন।
উদাহরণ:
class Item(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.IntegerField()
class Meta:
constraints = [
models.CheckConstraint(check=models.Q(price__gt=0), name='price_gt_0'),
models.CheckConstraint(check=models.Q(quantity__gte=0), name='quantity_gte_0')
]
এখানে price_gt_0 এবং quantity_gte_0 কাস্টম কনস্ট্রেইন্ট যোগ করা হয়েছে যাতে দাম শূন্যের চেয়ে বড় হয় এবং পরিমাণ শূন্য বা তার বেশি থাকে।
সারাংশ
clean()মডেল ফিল্ডগুলোর ভ্যালিডেশন এবং কাস্টম লজিক চেক করার জন্য ব্যবহৃত হয়।full_clean()মডেল, ফিল্ড, এবং ইউনিক কনস্ট্রেইন্টসহ পূর্ণ ভ্যালিডেশন করার জন্য ব্যবহৃত হয়।- সর্বদা
save()এর আগেfull_clean()ব্যবহার করা উচিত যেনো সঠিক ভ্যালিডেশন চেক করা যায়।
এই টিউটোরিয়াল অনুসরণ করে তুমি সহজেই Django মডেলে কাস্টম ভ্যালিডেশন এবং ভ্যালিডেশন চেক করতে পারবে!