Django

⌘K
  1. Home
  2. Django
  3. Model
  4. Model মডেল

Model মডেল

মডেল বানাই মাইগ্রেশন , মাইগ্রেট করি

মনে করি আমরা ব্লগ এর পোস্টের জন্য মডেল বানাবো আমাদের এজন্য এপ্প এর models.py ফাইলে মডেল তৈরী করি

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    
    def __str__(self):
        return self.title

মাইগ্রেশন

বই এর ভাষায় বলতে গেলে মাইগ্রেশন(Migration) হলো আমাদের এপ এর ডাটাবেজ(Database) এর স্কিমা(Schema).

মডেল বানানোর পর মাইগ্রেশন করলে মডেল অনুযায়ী একটি মাইগ্রেশন ফাইল তৈরী হয় যেখানে মডেল অনুযায়ী sql কোডের পাইথন কোড তৈরী হয়। পরবর্তীতে মাইগ্রেট করলে ডাটাবেজ এ টেবিল তৈরী হয়।

প্রজেক্ট ফোল্ডারে cmd ওপেন করে মাইগ্রেশন কমান্ড রান করি

python manage.py makemigrations

মাইগ্রেট

python manage.py migrate

মডেল ভ্যালিডেশন করা

স্ট্রিং লেন্থ চেক:

from django.core.validators import MaxLengthValidator, MinLengthValidator

class Book(models.Model):
    title = models.CharField(max_length=100, validators=[MaxLengthValidator(100), MinLengthValidator(5)])

ইমেল যাচাই:

from django.core.validators import EmailValidator

class Author(models.Model):
    email = models.EmailField(validators=[EmailValidator()])

ফোন নম্বর যাচাই:

from django.core.validators import RegexValidator
from django.db import models

class UserProfile(models.Model):
    phone_regex = RegexValidator(
        regex=r'^\+?1?\d{9,15}$',
        message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed."
    )
    phone_number = models.CharField(validators=[phone_regex], max_length=17)

পূর্ণসংখ্যা যাচাই:

from django.core.validators import MinValueValidator, MaxValueValidator

class Rating(models.Model):
    stars = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)])

তারিখ যাচাই:

from django.core.validators import DateValidator
from django.db import models

class Event(models.Model):
    date = models.DateField(validators=[DateValidator()])

ইনফরম্ড ডেটা যাচাই:

from django.core.validators import URLValidator
from django.db import models

class Website(models.Model):
    url = models.URLField(validators=[URLValidator()])

Default ভ্যালিডেশন ফাংশন:

from django.core.exceptions import ValidationError
class Item(models.Model):
    quantity = models.PositiveIntegerField(default=0)
    def clean(self):
        if self.quantity == 0:
            raise ValidationError("Quantity cannot be 0.")

কাস্টম ভ্যালিডেশন ফাংশন:

from django.core.exceptions import ValidationError

def validate_even(value):
    if value % 2 != 0:
        raise ValidationError(
            _('%(value)s is not an even number'),
            params={'value': value},
        )

class EvenNumber(models.Model):
    number = models.IntegerField(validators=[validate_even])

Unique ইউজার দেখা

from django.db import models
from django.core.validators import ValidationError
from django.utils.translation import gettext_lazy as _

def validate_unique_username(value):
    existing_users = User.objects.filter(username=value)
    if existing_users.exists():
        raise ValidationError(
            _('%(value)s already exists as a username.'),
            params={'value': value},
        )

class User(models.Model):
    username = models.CharField(
        max_length=30,
        unique=True,
        validators=[validate_unique_username],
    )

    def __str__(self):
        return self.username

মডেল কাস্টমাইজ

মডেল কাস্টমাইজ

মেটা ক্লাস ব্যবহার করেComment

মডেল এ মেটা ক্লাস ব্যবহার করে আমরা মডেল কাস্টমাইজ করতে পারি

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    
    class Meta:
        ordering = ['-pub_date']
        verbose_name = 'Blog Post'
        verbose_name_plural = 'Blog Posts'

মডেলকে অ্যাডমিন প্যানেলে যোগ করি

মডেলকে Django এডমিন প্যানেলে যোগ করা খুবই সহজ । নিম্নলিখিত মাধ্যমে আপনি মডেলটি আপনার Django প্রোজেক্টে এডমিন প্যানেলে সংযুক্ত করতে পারেন:Comment

প্রথমত, মডেল ডেফিনিশন:

আমরা মডেল ডেফিনিশন থেকে শুরু করব। মডেল ডেফিনিশন দিচ্ছি:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)


মডেল অ্যাডমিন:

এখন আমরা মডেলটি এডমিন প্যানেলে যোগ করার জন্য এডমিন ক্লাস তৈরি করব।

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'pub_date')
    search_fields = ('title', 'author__name')  # Assuming Author model has a 'name' field
    list_filter = ('author',)
    ordering = ('-pub_date',)
    readonly_fields = ('pub_date',)
    

list_display (তালিকা_প্রদর্শন): এটি ডিজাঙ্গো এডমিন তালিকা দৃশ্যতা নির্ধারণ করে, এই ফিল্ডগুলি তালিকা ভিউতে প্রদর্শিত হবে।

search_fields (সার্চ_ক্ষেত্র): এটি ডিজাঙ্গো এডমিন তালিকা ভিউতে সার্চ বক্স যুক্ত করে, যার মাধ্যমে আপনি ডেটা সার্চ করতে পারবেন।

list_filter (তালিকা_ফিল্টার): এটি ডিজাঙ্গো এডমিন তালিকা ভিউতে ফিল্টার অপশন যুক্ত করে, যার মাধ্যমে আপনি ডেটা ফিল্টার করতে পারবেন।

ordering (সাজানো): এটি ডিজাঙ্গো এডমিন তালিকা ভিউে ডেটা সাজানোর ডিফল্ট আদান-প্রদান নির্ধারণ করে।

readonly_fields দেয়ার কারণে অ্যাডমিন প্যানেল এ সেভ করার সময় কোন ইনপুট ফিল্ড শো করবে না।

prepopulated_fields বলতে বুঝি কোন একটা ফিল্ড ইনপুট দিলে অন্য একটি ফিল্ড ওই ইনপুট ধারণ করা আরো সহজ ভাবে বললে মনে করি আমাদের একটি ব্লগ app আছে যার একটি title ও slug নামে ফিল্ড আছে আমরা চাচ্ছি title এ যা লিখবো তা slug এ prepopulated হয়ে বসে যাবে এটা করার জন্য admin.py তে modelAdmin ক্লাস এ নিচের মত লিখতে হয় মনে করি আমাদের মডেল এর নাম POST

prepopulated_fields

#models.py
class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
#admin.py
from .models import  Post
class PostAdmin(admin.ModelAdmin):

    prepopulated_fields = {'slug': ('title',)}

admin.site.register(Post,PostAdmin)

অ্যাডমিন প্যানেলে মডেলকে আরো বিভিন্ন ফিচার দেয়ার টিউটোরিয়াল অ্যাডমিন টিউটোরিয়ালে দেয়া আছে

মডেলকে একবার সেভ করা যাবে

মনে করি আমাদের app এ কোম্পানি ইনফরমেশন এর দরকার যা শুধু একবার সেভ করতে হয় পরে আপডেট করতে হয় আর দ্বিতীয় কোন ডেটা ইন্সার্ট করতে দেয়া হয় না এটা করার জন্য আমাদের নিচের পদ্ধতি অবলম্বন করবো।Comment

models.py

from django.db import models

class CompanyInfoManager(models.Manager):
    def get_or_create_single(self, defaults=None, **kwargs):
        instance, created = self.get_or_create(**kwargs, defaults=defaults)
        return instance

class CompanyInfo(models.Model):
    name = models.CharField(max_length=100)
    address = models.TextField()
    # Add other fields as needed

    objects = CompanyInfoManager()

    def save(self, *args, **kwargs):
        # Ensure that only one instance exists
        if CompanyInfo.objects.exists() and not self.pk:
            raise ValueError("Only one CompanyInfo instance can be created.")
        super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        # Prevent deletion of the instance
        pass

    class Meta:
        verbose_name_plural = "Company Information"
 

admin.py

from django.contrib import admin
from .models import CompanyInfo

@admin.register(CompanyInfo)
class CompanyInfoAdmin(admin.ModelAdmin):
    # Define the fields to display and edit in the admin panel
    list_display = ('name', 'address')
    fields = ('name', 'address')
    # Disable the "Add" button in the admin panel
    def has_add_permission(self, request):
        return False

Articles

How can we help?