(3) ورشة تطوير تطبيقات الويب باستخدام Django: بناء ال models


#1

أهلا بالجميع

في الدرس السابق أنشأنا مشروع Django جديد. لكن مازال بقي معنا خطوة أخيرة ثم نبدأ العمل الفعلي و هي انشاء app جديدة

ماهو الفرق بين المشروع -Project- و التطبيق -App- ؟

ال Project هو مجموعة من التطبيقات المرتبة بطريقة معينة لتعطينا موقع معين بحيث المشروع يمكنه أن يحتوي على عدة تطبيقات و كل تطبيق يمكنه أن يكون في عدة مشاريع

كيف انشئ تطبيق جديد ؟

سوف ننشئ تطبيق جديد و نسميه shop

1- أكتب الأمر

`python manage.py startapp shop`

ستلاحظ اضافة مجلد اسمه shop يحتوي على الكثير من الملفات (سنمر عليها خلال الورشة)

           shop/
	    __init__.py
	    admin.py
	    apps.py
	    migrations/
		__init__.py
		models.py
		tests.py
		views.py	

2- كيف نجعل المشروع يعرف أننا أضفنا تطبيق جديد ؟
من خلال setting.py نضيف shop الى INSTALLED_APPS هكدا

    INSTALLED_APPS = [
	    'django.contrib.admin',
	    'django.contrib.auth',
	    'django.contrib.contenttypes',
	    'django.contrib.sessions',
	    'django.contrib.messages',
	    'django.contrib.staticfiles',
	    'shop',	
	]

ما التالي ؟

الآن سنبدأ في كتابة مشروعنا و أول ما نحتاجه هو أن نعرف ال models التي نحتاجها في مشروعنا و هي Category و Product

أين نقوم بدلك ؟

سنقوم بانشاء ال models في shop/models.py

ما الدي سنحتاجه لإنشاء Product ؟

ميزة Django أنه يعتبر all batteries included framework أي أنه يحتوي على كل ما تحتاج لبناء موقع متكامل بدون الحاجة الى أي اضافات
من بين ما يوفره Django هي django.db لكل العمليات الضرورية لل models و migrations (سنشرحها بعد قليل)

في models.py قم ب

from django.db import models

كيف نعرف Product ؟

بنفس الطريقة مثل Flask : انشاء class باسم Product و نملأها بالحقول الضرورية كالتالي

class Product(models.Model):
	# هنا نضع الحقول الضرورية

ماهي الحقول التي نحتاجها في Product ؟

لاحظ الصورة التالية من موقع Ebay … ماهي العناصر الأساسية التي يمكننا استخلاصها ؟

لدينا

  • الاسم, السعر, الكمية المتوفرة, الصورة
  • سنضيف اليها تاريخ وضع السلعة و وصف للسلعة و حقل جديد اسمه slug

ماهو slug ؟

لاحظ ال url التالي

https://discourse.coretabs.net/t/welcome-to-coretabs 

الجزء welcome-to-coretabs يسمى slug و سنستخدمه لبناء ال urls لكل منتج

هل هناك شروط اضافية للحقول ؟

نعم بالتأكيد لنبدأ واحدة بواحدة

  • الاسم -name- : الاسم سيكون CharField و نحتاج أن نحدد max length كالتالي

    name = models.CharField(max_length=100)
    
  • السعر -price- : سيكون DecimalField أي عدد عشري و يجب أن يقبل عددين بعد الفاصلة فقط

    price = models.DecimalField(max_digits=10, decimal_places=2)
    
  • الكمية المتوفرة -stock- : سيكون PositiveIntegerField

    stock = models.PositiveIntegerField()
    
  • تاريخ وضع السلعة -created_at- : سيكون DateTimeField

    created_at = models.DateTimeField(auto_now_add=True)
    

لاحظ أننا أضفنا auto_add_true وهي لجعل التاريخ يضاف أوتوماتيكيا

  • وصف للسلعة -description- : سيكون TextField مع امكانية تركه فارغا

      description = models.TextField(blank=True)
    
  • أخيرا slug وسيكون SlugField و unique

      slug = models.SlugField(unique=True, blank=True)
    

هل هدا كل شيئ ؟

لا ليس بعد سنضيف شيئ أخير للتحكم أكثر بال model و هي Meta class

ماهي Meta class ؟

يمكنك اعتبارها كلوحة تحكم الخاصة بال model
نحن سنضيف فقط ordering لكي نحدد كيف سيتم ترتيب ال products عند سردهم

class Meta:
	ordering = ('name', )

لنرى النتيجة النهائية في models.py

from django.db import models


class Product(models.Model):
	name = models.CharField(max_length=100)	
	price = models.DecimalField(max_digits=10, decimal_places=2)
	stock = models.PositiveIntegerField()
	created_at = models.DateTimeField(auto_now_add=True)
	description = models.TextField(blank=True)
	slug = models.SlugField(unique=True, blank=True)

	class Meta:
		ordering = ('name', )

ما الدي قمنا به الآن ؟

بانشاءنا ال models نحن أنشأنا مخطط ل Django لكي يشكل لنا قاعدة البيانات الخاصة بنا

كيف ننشئ قاعدة البيانات ؟

علينا أولا أن نحدد قاعدة البيانات من خلال DATABASE في setting.py
الخيار الافتراضي هو Sqlite وهو ما سنستعمله
أيضا علينا أن نجهز ال migrations ل shop بالأمر التالي

python manage.py makemigrations shop

لعمل migrations لكل التطبيقات نستعمل makemigrations بدون تحديد ال app ( أمر ضروري تكون كل apps جاهزة قبل تشغيل الموقع )

python manage.py makemigrations

ماهي migrations ؟

هي طريقة لحفظ التعديلات على مخطط ال database مثل اضافة model أو حدفه أو تعديله و هي تساعدنا على تعديل المخطط بدون ما نحدف كل البيانات و انشاءها من جديد
لاحظ مثلا ال output لما نعمل makemigrations ل shop

Migrations for 'shop':
  shop/migrations/0001_initial.py
    - Create model Product

لاحظ أن ال django جهز النسخة الحالية من ال migrations في مجلد shop/migrations/0001_initial.py

لمادا migrations ؟

الطريقة التقليدية لتغيير مخطط قاعدة البيانات هي فتح قاعدة البيانات واستعمال ALTER و لكن ال migrations وفرت علينا كل هدا العناء

لكننا لم ننشئ قاعدة البيانات !؟

الأمر makemigrations جهزنا به التغييرات على البيانات و لكن لتطبيقها علينا أن نقوم بها كالتالي

python manage.py migrate

لاحظ ال output

Operations to perform:
  Apply all migrations: shop
Running migrations:
  Applying shop.0001_initial... OK

لاحظ أيضا أنه تم انشاء db.sqlite3 و هكدا قاعدة البيانات جاهزة

ما الدي بقي لنا ؟

بقي لنا استعمال Foreign Key في Product ليربط ال Product ب Category لتكون OneToMany relationshipبهدا الشكل

category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)

لكن لا يمكننا فعل دلك حتى ننشئ Category … هنا يأتي دورك

ما هي المهمة المطلوبة ؟

أولا أعد القيام بكل ما فعلناه مع Product
ثم انشئ Category الدي يحتوي على name, slug, created_at, description و أضف ordering بالطريقة المناسبة
لا تنسوا أن description تجعلوها TextField مع max length
لا تنسى تعمل migration و تطبق التغييرات على ال database

ملحق

المزيد عن models
المزيد عن model fields
المزيد عن Meta class

تسليم الحلول

(4) ورشة تطوير تطبيقات الويب باستخدام Django: مشاركة حلول بناء ال models


فهرس موضوعات ورشة تطوير تطبيقات الويب باستخدام Django
(4) ورشة تطوير تطبيقات الويب باستخدام Django: مشاركة حلول بناء ال models
(5) ورشة تطوير تطبيقات الويب باستخدام Django: التعامل مع Django ORM
#2

Thank you @hichem2h :blush:
Keep going :muscle::muscle:


#4

كيف اتاكد من انشائي لقاعدة البيانات بشكل صحيح ؟


#5

#6

افتح ملف قاعدة البيانات في برنامج DB Browser SQLite وتأكد من وجود الحقول بشكل صحيح


#7

ملف القاعدة اين اجده في مجلد المشروع الرئيسي ؟؟
او في داخل التطبيق


#8

أول ما تقوم بعمل migrate تجده في المجلد الرئيسي اسمه db.sqlite3


#9

وجدت حقل shop_product فقط مع العلم انا ضفت كلاس Category ؟؟؟
وقمت بعمل migrate ؟؟


#10


#11

استاذي تم فهم المشكلة لكن كيف احلها
يبدو ان Category غير موجود في قاعدة البيانات
قمت بحذف

category = models.ForeignKey(Category, related_name=‘products’, on_delete=models.CASCADE)

من الكلاس واصبحت تعمل الان لكن Category غير موجودة
هذا السطر كان يشير الى ForeignKey من الكلاس الاخر وهو فعليا غير موجود عند حذفه بامكاني الوصول لاضافة وتعديل منتج
الان كيف يمكنني حل المشكلة


#12

الحمدلله
حذفت ملف الداتا بيس
وقمت بكامل التعديلات
,انشأتها من البداية
وهي الان تعمل
استاذ @YaserAlnajjar :heart_eyes: شكرا لنصيحتك بشأن DB Browser SQLite وفرت على الطريق الصعب لحل المشكلة