Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Django এর Meta ক্লাসে বিভিন্ন মেটাডাটা কনফিগার

Django এর Meta ক্লাসে বিভিন্ন মেটাডাটা কনফিগার

বিভিন্ন মেটাডাটা কনফিগার করতে পারেন। এটি মডেলের বিহেভিয়ার কন্ট্রোল করে এবং ডাটাবেসে টেবিল কিভাবে তৈরি হবে এবং Django অ্যাডমিন এবং কিউয়ারি সেট কিভাবে কাজ করবে তা নিয়ন্ত্রণ করতে সহায়তা করে।

এখানে Django এর Meta ক্লাসের সবগুলো অপশন এবং সেগুলোর কাজ তুলে ধরা হলো:

১. db_table:

এই অপশনটি ডাটাবেসে মডেলের জন্য কাস্টম টেবিলের নাম নির্ধারণ করতে ব্যবহার করা হয়। ডিফল্টভাবে, Django মডেলের নাম অনুসারে টেবিল তৈরি করে, কিন্তু db_table দিয়ে আপনি টেবিলের নাম নির্দিষ্ট করতে পারেন।

class MyModel(models.Model):
    field1 = models.CharField(max_length=100)

    class Meta:
        db_table = 'my_custom_table_name'

২. ordering:

এটি মডেলের ডিফল্ট অর্ডারিং নির্ধারণ করে। কোন ফিল্ড অনুযায়ী ডাটাবেসের রেকর্ডগুলোকে সাজানো হবে, তা নির্দিষ্ট করা যায়।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        ordering = ['name']  # 'name' ফিল্ড অনুযায়ী অর্ডার হবে

৩. verbose_name:

মডেলের জন্য হিউম্যান রিডেবল (ব্যবহারকারীদের জন্য সহজে বোধ্য) নাম নির্ধারণ করে।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        verbose_name = 'My Model'  # Django অ্যাডমিনে মডেলের নাম এইভাবে দেখাবে

৪. verbose_name_plural:

মডেলের প্লুরাল (বহুবচন) ফর্ম নির্ধারণ করে, যা Django অ্যাডমিনে প্রদর্শিত হয়।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        verbose_name_plural = 'My Models'

৫ . constraints:

ডাটাবেস লেভেলে ভ্যালিডেশন আরোপ করার জন্য constraints ব্যবহার করা হয়, যেমন আমরা আগের টিউটোরিয়ালে দেখেছি।

class MyModel(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__gte=0), name='salary_gte_0')
        ]

৬ . indexes:

এটি ডাটাবেস টেবিলের ইনডেক্স নির্ধারণ করতে ব্যবহার করা হয়। index_together ডিপ্রিকেট হওয়ার পর থেকে এটি ব্যবহৃত হয়।

from django.db.models import Index

class MyModel(models.Model):
    field1 = models.CharField(max_length=100)
    field2 = models.CharField(max_length=100)

    class Meta:
        indexes = [
            Index(fields=['field1', 'field2'])
        ]

৭ . default_permissions:

মডেলের ডিফল্ট পারমিশন (যেমন add, change, delete, view) কন্ট্রোল করতে এটি ব্যবহার করা হয়।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        default_permissions = ('add', 'change')  # কেবলমাত্র add এবং change পারমিশন থাকবে

৮ . permissions:

কাস্টম পারমিশন যোগ করার জন্য এটি ব্যবহার করা হয়।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        permissions = [
            ('can_publish', 'Can Publish'),
            ('can_archive', 'Can Archive'),
        ]

৯ . get_latest_by:

ডিফল্টভাবে কোন ফিল্ডের উপর ভিত্তি করে latest() এবং earliest() মেথড কাজ করবে, তা নির্ধারণ করতে ব্যবহার করা হয়।

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        get_latest_by = 'created_at'

১ ০ . managed:

যদি managed = False সেট করা হয়, তাহলে Django ডাটাবেসে টেবিল তৈরির কাজ করবে না। এটি তখন ব্যবহার করা হয় যখন আপনি Django দিয়ে তৈরি নয় এমন কোনো টেবিল ব্যবহারের পরিকল্পনা করেন।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        managed = False  # Django টেবিল তৈরি করবে না

১১ . select_on_save:

এই অপশনটি দিয়ে আপনি নির্ধারণ করতে পারেন যে মডেল সেভ করার আগে ডাটাবেস থেকে রেকর্ড নিয়ে আসা হবে কিনা।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        select_on_save = True  # সেভ করার আগে রেকর্ড সিলেক্ট করবে

১২ . app_label:

মডেলটি কোন অ্যাপের অন্তর্ভুক্ত, তা স্পষ্টভাবে নির্দিষ্ট করতে app_label ব্যবহার করা হয়, বিশেষত যখন মডেলটি কোনো আলাদা ফাইল বা মডিউলে থাকে।

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        app_label = 'my_app'  # মডেলটি কোন অ্যাপের অন্তর্ভুক্ত তা নির্ধারণ

১ ৩. unique_for_date, unique_for_month, এবং unique_for_year

Django-তে unique_for_date, unique_for_month, এবং unique_for_year ফিল্ড অপশনগুলি ডাটাবেস লেভেলের কনস্ট্রেইন্ট হিসেবে কাজ করে। এগুলো নির্দিষ্ট একটি তারিখ, মাস, বা বছর এর জন্য একটি ফিল্ডের ভ্যালু ইউনিক হওয়া নিশ্চিত করে। এগুলো সাধারণত এমন মডেলে ব্যবহৃত হয় যেখানে নির্দিষ্ট সময়সীমায় একটি ইউনিকনেস মেইন্টেইন করতে হবে।

unique_for_date, unique_for_month, এবং unique_for_year এর কার্যকারিতা

  • unique_for_date: নির্দিষ্ট একটি তারিখের মধ্যে একটি ফিল্ডের মান ইউনিক রাখতে ব্যবহৃত হয়।
  • unique_for_month: নির্দিষ্ট মাসের মধ্যে একটি ফিল্ডের মান ইউনিক রাখতে ব্যবহৃত হয়।
  • unique_for_year: নির্দিষ্ট বছরের মধ্যে একটি ফিল্ডের মান ইউনিক রাখতে ব্যবহৃত হয়।

উদাহরণ: unique_for_date, unique_for_month, unique_for_year ব্যবহার

ধরুন, আমরা একটি ব্লগ পোস্ট মডেল তৈরি করতে যাচ্ছি, যেখানে একটি শিরোনাম নির্দিষ্ট তারিখ, মাস, বা বছরের জন্য ইউনিক থাকবে।

from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    pub_date = models.DateField()

    # This title must be unique for the same date
    title.unique_for_date = pub_date

    # This title must be unique for the same month
    title.unique_for_month = pub_date

    # This title must be unique for the same year
    title.unique_for_year = pub_date

    def __str__(self):
        return self.title

উদাহরণ ব্যাখ্যা:

  1. title.unique_for_date = pub_date:
    • এটি নিশ্চিত করে যে, একই pub_date এর মধ্যে কোনো দুইটি পোস্টের শিরোনাম একই হতে পারবে না।
    • অর্থাৎ, যদি একটি পোস্ট 2023-10-01 তারিখে প্রকাশিত হয় এবং সেটির শিরোনাম My First Post হয়, তাহলে সেই তারিখে আরেকটি পোস্ট My First Post নামের হতে পারবে না।
  2. title.unique_for_month = pub_date:
    • এটি নিশ্চিত করে যে, একই মাসে দুটি পোস্টের শিরোনাম একই হতে পারবে না।
    • উদাহরণস্বরূপ, যদি অক্টোবর মাসে (2023-10) একটি পোস্টের শিরোনাম My Second Post হয়, তাহলে সেই মাসে আরেকটি পোস্ট এই শিরোনাম ব্যবহার করতে পারবে না।
  3. title.unique_for_year = pub_date:
    • এটি নিশ্চিত করে যে, একটি নির্দিষ্ট বছরের মধ্যে শিরোনাম ইউনিক থাকবে।
    • অর্থাৎ, 2023 সালে যদি My Third Post নামে কোনো পোস্ট থাকে, তাহলে 2023 সালে আর কোনো পোস্ট এই শিরোনাম ব্যবহার করতে পারবে না, তবে 2024 সালে তা সম্ভব হবে।

Form validation:

unique_for_date, unique_for_month, এবং unique_for_year কনস্ট্রেইন্টগুলো Django এর form validation স্তরে কাজ করে। যদি আপনি নতুন কোনো ব্লগ পোস্ট তৈরি করতে যান এবং কনস্ট্রেইন্টগুলো মেনে না চলেন, তাহলে Django একটি ValidationError দেখাবে।

প্রাকটিক্যাল উদাহরণ

ধরুন, আমাদের একটি ব্লগ মডেল আছে, এবং আমরা একটি ফর্ম থেকে পোস্ট তৈরি করতে যাচ্ছি:

from django import forms
from .models import BlogPost

class BlogPostForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fields = ['title', 'content', 'pub_date']

    def clean(self):
        cleaned_data = super().clean()
        title = cleaned_data.get('title')
        pub_date = cleaned_data.get('pub_date')

        # Ensure unique_for_date is respected
        if BlogPost.objects.filter(title=title, pub_date=pub_date).exists():
            raise forms.ValidationError("The title must be unique for the same date.")

        return cleaned_data

টেস্ট কেস উদাহরণ

ধরুন, আমরা একটি ব্লগ পোস্ট তৈরি করতে চাই, যেখানে একই দিনে একাধিক পোস্টের শিরোনাম একই হবে না:

from django.test import TestCase
from .models import BlogPost

class BlogPostTestCase(TestCase):
    def setUp(self):
        BlogPost.objects.create(title='My Unique Post', content='Test Content', pub_date='2023-10-01')

    def test_unique_title_for_date(self):
        # Trying to create a post with the same title on the same date should fail
        with self.assertRaises(Exception):
            BlogPost.objects.create(title='My Unique Post', content='Another Test', pub_date='2023-10-01')

    def test_unique_title_for_month(self):
        # Creating a post with the same title but different date in the same month should fail
        with self.assertRaises(Exception):
            BlogPost.objects.create(title='My Unique Post', content='Another Test', pub_date='2023-10-15')

    def test_unique_title_for_year(self):
        # Creating a post with the same title but different date in the same year should fail
        with self.assertRaises(Exception):
            BlogPost.objects.create(title='My Unique Post', content='Another Test', pub_date='2023-12-01')

উপসংহার:

  • unique_for_date, unique_for_month, এবং unique_for_year ফিল্ড অপশনগুলো ডেটা ইউনিকনেস নির্দিষ্ট সময়সীমার মধ্যে কন্ট্রোল করতে সহায়ক।
  • এটি বিশেষ করে ব্লগ পোস্ট, ইভেন্ট সিস্টেম, বা অন্যান্য সময় ভিত্তিক মডেলগুলোতে কার্যকর।

How can we help?