Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Django Meta ক্লাসে constraints নিয়ে বিশদ টিউটোরিয়াল

Django Meta ক্লাসে constraints নিয়ে বিশদ টিউটোরিয়াল

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 কিভাবে ব্যবহার করতে হয়, তা প্রফেশনাল ভাবে বুঝতে পারলেন এবং প্রয়োগ করতে পারবেন!

How can we help?