Web Framework ที่ชื่อ Django สามารถสร้าง CRUD ได้ง่ายดาย รวดเร็ว เพียงแต่สร้าง Model ให้ถูกต้อง Django จะจัดการสร้างหน้า Interface ให้อย่างสวยงาม แทบจะไม่ต้องเขียนคำสั่งใด ๆ เลย การปรับแต่งให้เป็นภาษาไทยก็ทำได้ดี
ในตอนที่ 6 จะขอนำเสนอการสร้างโมเดล หรือ database table ที่มีความสัมพันธ์กันบ้าง เพื่อให้เห็นว่า Django สามารถทำได้ดีทีเดียว
เมื่อย้อนกลับไปดู ตอนที่ 3 เพื่อดูรูป Schema  ER-D ของ Northwind จะเห็นว่า Suppliers จะมีความสัมพันธ์กับ Products แบบ  one to many และขณะเดียวกัน Categories ก็มีความสัมพันธ์กับ Products แบบ one to many เช่นเดียวกัน ดังนั้น การสร้างโมเดล จึงต้องสร้าง 1 class ต่อ 1 entity ซึ่งแต่ละ entity มีความสัมพันธ์กัน เราต้องสร้างฟิลด์ เพื่อบอกให้ Django ทราบความสัมพันธ์ด้วย 
ขั้นตอนและวิธีการสร้าง มีดังนี้

 

  1. เปิดไฟล์ models.py เดิม มาเพิ่มคำสั่งสร้างคลาสขึ้นอีกจำนวน 2 คลาสโดยพิมพ์ต่อท้ายบรรทัดล่างสุด และการจัดตำแหน่งให้อยู่คอลัมน์หน้าสุด ระดับเดียวกับ class Suppliers ดังนี้

 

class Categories(models.Model):
    CateName = models.CharField(max_length=100,verbose_name='ชื่อประเภทสินค้า')
    Description = models.CharField(max_length=255,verbose_name='รายละเอียด')
    class Meta:
        verbose_name_plural = "ข้อมูลประเภทสินค้า"
        verbose_name = "ข้อมูลประเภทสินค้า"
        ordering = ['CateName']

    def __unicode__(self):
        return self.CateName




class Products(models.Model):
    ProdID = models.CharField(max_length=13,primary_key=True,verbose_name='รหัสสินค้า')
    ProdName = models.CharField(max_length=100,verbose_name='ชื่อสินค้า')
    Supplier = models.ForeignKey(Suppliers,verbose_name='ตัวแทนจำหน่าย')
    Category = models.ForeignKey(Categories,verbose_name='ประเภทสินค้า')
    Price =models.DecimalField(max_digits=10,decimal_places=2,verbose_name='ราคา')
    UnitInStock = models.IntegerField(max_length=6,verbose_name='จำนวนที่เก็บในสต็อก')
    UnitOnOrder = models.IntegerField(max_length=6,verbose_name='จำนวนที่สั่งซื้อต่อครั้ง')
    ReOrderLevel = models.IntegerField(max_length=6,verbose_name='จำนวนสต็อกต่ำสุด')
     
    class Meta:
        verbose_name_plural = "ข้อมูลสินค้า"
        verbose_name = "ข้อมูลสินค้า"
        ordering = ['ProdID']


    def __unicode__(self):
        return u"%s %s" % (self.ProdID, self.ProdName)

 

ขอให้พิจารณา สังเกตคำสั่งที่มีสีแดงนะครับ นั่นคือ ฟิลด์ที่บอกความสัมพันธ์ระหว่าง entity การตั้งชื่อฟิลด์จะเหมือนหรือต่างก็ได้ 
นอกจากนี้ขอให้สังเกต primary key ของทั้ง 2 class นะครับว่ามีความแตกต่างกัน
class Categories จะไม่เห็นมี primary key ทั้งนี้เพราะว่า Django บอกว่า ถ้า primary key entity ใด ๆ ที่เป็น auto number หรือ auto increment ถ้าเราไม่ระบุไว้ในการกำหนดชื่อฟิลด์เอาไว้ Django จะสร้างให้เองอย่างอัตโนมัติ ชื่อว่า id
แต่ในทางกลับกันกับ class Products ถ้าเราต้องการให้รหัสสินค้าเป็น primary key ที่ต้องอ่านจากเครื่องอ่าน barcode ผู้ใช้จึงต้องป้อนข้อมูลรหัสสินค้าด้วยตนเอง ดังนั้น การกำหนดให้เป็น primary key จึงต้องเพิ่มคำว่า primary_key = True
ต่อไปเป็นการสั่งให้ Django สร้าง Database table และสร้างฟอร์ม ด้วยการใช้คำสั่ง syncdb ดังนี้
c:\repository\django\bin\bmis>manage.py syncdb
ต่อจากนั้นทดลองสั่งให้ Server ทำงาน ยังจำกันได้ไหมครับ ใช้บ่อย ๆ นั่นคือ
c:\repository\django\bin\bmis>manage.py runserver
เปิด Browser และไปที่ localhost:8000/admin/
เข้าสู่ระบบให้ได้ จะเห็นว่าไม่มีอะไรเกิดขึ้น อย่าเพิ่งตกใจ เพราะเรายังไม่ได้ register ให้กับ admin.py ดังนั้น จงเข้าใจเสียเลยว่า ถ้าเราต้องการให้ class ใด ๆ ให้ admin ใช้ได้ จะต้อง register ในไฟล์ admin.py เสียก่อน
เริ่มด้วยการเปิดไฟล์ admin.py แล้วเพิ่มคำสั่ง 2 บรรทัดต่อไปนี้เข้าไปต่อท้ายบรรทัดล่างสุด ดังนี้
admin.site.register(Products)


admin.site.register(Categories)

 ถัดจากนั้นไปที่ Browser แล้ว refresh หรือ F5 หน้าจอที่ได้จะเป็นดังภาพด้านล่าง

 

เมื่อทดลองป้อนข้อมูลทั้ง ข้อมูลประเภทสินค้า และผู้จัดจำหน่ายเข้าไปประมาณ 3-5 รายการ แล้วมาป้อนข้อมูลสินค้า หน้าตาของฟอร์มจะเป็นดังภาพ ด้านล่าง ต่อไปนี้