2 වන කොටස: Models සහ දත්ත සමුදාය

Python කේත පමණක් භාවිතා කර දත්ත සමුදා වගු නිර්මාණය කරන ආකාරය.


Django හි, Model එකක් යනු ඔබගේ දත්ත සමුදායේ (database) ඇති වගුවක (table) නිල නිරූපණයයි. සරලවම, එය Python Class එකක් ලෙස ලියන අතර, එම class එකේ ඇති සෑම ගුණාංගයක්ම (attribute) දත්ත සමුදා වගුවේ තීරුවකට (column) අනුරූප වේ.

මෙම ක්‍රමවේදය ORM (Object-Relational Mapper) ලෙස හඳුන්වයි. దీని තේරුම, දත්ත සමුදාය සමග සම්බන්ධ වීමට SQL විමසුම් (queries) වෙනුවට Python objects (අපගේ Models) භාවිතා කිරීමයි. මෙය කේතය වඩාත් පැහැදිලි සහ නඩත්තු කිරීමට පහසු කරයි.

අපගේ පීසා වර්ග සහ ඒවායේ මිල ගබඩා කිරීමට Pizza නමින් model එකක් සාදමු. මේ සඳහා orders/models.py ගොනුව විවෘත කර පහත කේතය ඇතුලත් කරන්න.

from django.db import models

class Pizza(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.name

කේතය පැහැදිලි කිරීම:
  • class Pizza(models.Model): - Pizza නමින් නව model එකක් නිර්මාණය කරයි. එය Django හි මූලික Model class එකෙන් උරුම වේ.
  • name = models.CharField(...) - පීසා එකේ නම ගබඩා කිරීමට අක්ෂර 100ක උපරිමයකට යටත් පෙළ ක්ෂේත්‍රයක් (text field) නිර්මාණය කරයි.
  • price = models.DecimalField(...) - මිල ගබඩා කිරීමට දශම ක්ෂේත්‍රයක් (decimal field) නිර්මාණය කරයි. max_digits=5 මගින් ඉලක්කම් 5ක උපරිමයක්ද, decimal_places=2 මගින් දශමස්ථාන 2ක්ද නියම කරයි (උදා: 999.99).
  • def __str__(self): - මෙම object එක Django admin වැනි තැන්වලදී නිරූපණය කළ යුතු ආකාරය නිර්වචනය කරයි. මෙහිදී අපි පීසා එකේ නම පෙන්වීමට සලස්වා ඇත.

දැන්, පාරිභෝගික ඇණවුම් පිළිබඳ විස්තර ගබඩා කිරීමට Order model එක නිර්මාණය කරමු. orders/models.py ගොනුවටම පහත කේතය එක් කරන්න.

from django.contrib.auth.models import User

# (Pizza model එකට පහලින් මෙය එක් කරන්න)
class Order(models.Model):
    STATUS_CHOICES = (
        ('Pending', 'Pending'),
        ('Approved', 'Approved'),
        ('Delivered', 'Delivered'),
    )

    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    total_price = models.DecimalField(max_digits=7, decimal_places=2)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='Pending')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'Order {self.id} by {self.user.username}'

කේතය පැහැදිලි කිරීම:
  • pizza = models.ForeignKey(...) - මෙම ඇණවුම කුමන Pizza එකකටද යන්න සම්බන්ධ කරයි. ForeignKey මගින් models දෙකක් අතර සම්බන්ධතාවයක් ගොඩනගයි.
  • user = models.ForeignKey(User, ...) - ඇණවුම ලබාදුන් පරිශීලකයා (User) කවුදැයි Django හි සූදානම් User model එකට සම්බන්ධ කරයි.
  • on_delete=models.CASCADE - සම්බන්ධ කර ඇති Pizza එකක් හෝ User කෙනෙක් delete කළහොත්, ඊට අදාළ සියලුම Order ද delete විය යුතු බව නියම කරයි.
  • status = models.CharField(...) - ඇණවුමේ තත්ත්වය ගබඩා කරයි. choices මගින් Admin panel එකේදී dropdown මෙනුවක් ලෙස මෙය පෙන්වයි.
  • created_at = models.DateTimeField(...) - auto_now_add=True නිසා ඇණවුම සෑදූ වේලාව ස්වයංක්‍රීයව සටහන් කරයි.

අපි Python classes ලෙස නිර්මාණය කළ මෙම models, දැන් දත්ත සමුදායේ සැබෑ වගු (tables) බවට පත් කළ යුතුය. මේ සඳහා Django හි migrations පද්ධතිය භාවිතා වේ.

  1. පියවර 1: Migration Files සෑදීම
    Terminal එකේ පහත command එක run කරන්න. මෙමගින් Django ඔබගේ models.py ගොනුවේ සිදුකළ වෙනස්කම් හඳුනාගෙන, දත්ත සමුදාය වෙනස් කිරීමට අවශ්‍ය උපදෙස් සහිත migration ගොනුවක් (0001_initial.py වැනි) නිර්මාණය කරයි.
    python manage.py makemigrations
  2. පියවර 2: දත්ත සමුදාය යාවත්කාලීන කිරීම (Migrate)
    දැන්, ඉහත සෑදූ migration ගොනුව ක්‍රියාත්මක කර, දත්ත සමුදාය තුල orders_pizza සහ orders_order යනුවෙන් සැබෑ වගු නිර්මාණය කිරීමට පහත command එක run කරන්න.
    python manage.py migrate