ليه محتاجين Database؟
Persistence: البيانات تعيش بعد ما البرنامج يقفل
Without Database
- البيانات اللي في variables بتعيش طول ما السيرفر شغال فقط.
- لو عملت restart، البيانات المؤقتة بتضيع.
- صعب تشارك نفس البيانات بين مستخدمين كتير بشكل منظم.
student_list = ["Ali", "Mona"]
# after server restart, this list is goneWith Database
- البيانات بتتخزن بشكل دائم داخل Tables.
- تقدر تعمل Search, Filter, Update, Delete بسهولة.
- نفس السجلات متاحة لأجزاء مختلفة من النظام.
| id | name | level | department |
|---|---|---|---|
| 1 | Ali | 2 | CS |
| 2 | Mona | 2 | AI |
What Is a Django Model?
Python class describes stored data
الـ Model في Django هو Python class بيورث من models.Model.
كل attribute جوه الكلاس بيتحول إلى Column في Database table، وكل object من الكلاس بيمثل Row.
| Django Code | Database Meaning |
|---|---|
class Student(models.Model) | Table اسمه غالبًا students_student |
name = models.CharField(...) | Column |
Student(name="Ali") | Object / Row data |
__str__ | Readable display فقط، مش Column |
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
department = models.CharField(max_length=50)
def __str__(self):
return self.nameobjects, save(), delete().غالبًا الموديلات بتتكتب داخل models.py في app معينة، لأن كل app بتمسك جزء منطقي من النظام.
myproject/
├── manage.py
├── myproject/
└── students/
├── admin.py
├── apps.py
├── models.py # models live here
├── views.py
└── migrations/Fields and Options
اختيار نوع العمود وقواعده
| Field | Use Case | Example |
|---|---|---|
CharField | نص قصير مثل name, code, department | max_length مهم جدًا |
TextField | نص طويل مثل description, notes | غالبًا لا يحتاج max_length |
IntegerField | أرقام صحيحة مثل age, level, credit_hours | ليس مناسبًا للنصوص الرقمية مثل phone |
EmailField | إيميل بمعنى واضح | email = models.EmailField(blank=True) |
DateTimeField | وقت وتاريخ | auto_now_add, auto_now |
BooleanField | True / False | is_active |
id primary key تلقائيًا لو أنت معرفتش primary key بنفسك.null=True: قاعدة البيانات ينفع تخزن NULL.blank=True: الفورم/الـ admin يسمح إن الحقل يتساب فاضي.default=1: قيمة افتراضية لو المستخدم مدخلش قيمة.
email = models.EmailField(blank=True)
level = models.IntegerField(default=1)
department = models.CharField(max_length=50)choices بتخلي القيم controlled بدل ما كل واحد يكتب قيمة بشكل مختلف.
LEVEL_CHOICES = [
(1, "Level 1"),
(2, "Level 2"),
]
level = models.IntegerField(choices=LEVEL_CHOICES)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)Migrations Workflow
من model code إلى database table
الـ Migrations هي ملفات Python بتسجل تغييرات شكل الـ Database: إنشاء جدول، إضافة عمود، تعديل نوع Field... إلخ. اعتبرها history منظمة لتغييرات الـ schema.
models.py وتضيف/تغير fields.python manage.py makemigrations
python manage.py migrate
python manage.py showmigrations
python manage.py sqlmigrate students 0001makemigrations ينشئ ملفات migration فقط. migrate هو اللي يطبقها على الـ database. سؤال 2025 بيحاول يبدل المعنيين.- عدلت model ونسيت تعمل
migrate. - أضفت field إجباري على table فيها data قديمة من غير default.
- عدلت migration قديم بعد ما اتطبق.
- نسيت تضيف app في
INSTALLED_APPSقبل شغل models.
Relationships Between Models
الجداول الحقيقية مرتبطة ببعض
Many-to-One: طلاب كتير ينتموا لقسم واحد.
class Department(models.Model):
name = models.CharField(max_length=100)
class Student(models.Model):
department = models.ForeignKey(
Department,
on_delete=models.CASCADE
)One-to-One: طالب واحد له profile واحد فقط.
class StudentProfile(models.Model):
student = models.OneToOneField(
Student,
on_delete=models.CASCADE
)
phone = models.CharField(max_length=20)Many-to-Many: الطالب يأخذ كورسات كثيرة والكورس فيه طلاب كثير.
class Course(models.Model):
title = models.CharField(max_length=100)
class Student(models.Model):
courses = models.ManyToManyField(Course)ForeignKey. Student to IDCard = OneToOneField. Student to Course = ManyToManyField.Django ORM and CRUD
Object Relational Mapper: تكلم مع database بـ Python
الـ ORM يخليك تتعامل مع records كأنها Python objects. Django يحول أوامرك إلى SQL خلف الكواليس.
# Create
Student.objects.create(name="Ali", level=2, department="CS")
# Read
Student.objects.all()
Student.objects.filter(level=2)
student = Student.objects.get(id=1)
# Update
student.level = 3
student.save()
# Delete
student.delete()objects بحروف صغيرة. في 2025 ظهر سؤال Post.Objects.all()، وده غلط لأن Objects capital.Django Admin
واجهة جاهزة لإدارة البيانات
Django Admin هي built-in management interface بتسمح للـ admins يعملوا Add, Edit, Delete للـ records من غير ما تبني dashboard من الصفر.
/admin/.from django.contrib import admin
from .models import Student
admin.site.register(Student)python manage.py createsuperuseradmin.py وليس settings.py. وإنشاء admin user بالأمر createsuperuser وليس createuser.لو عايز الـ admin list تبقى أوضح، استخدم list_display, search_fields, list_filter.
from django.contrib import admin
from .models import Student
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
list_display = ("id", "name", "level", "department")
search_fields = ("name", "department")
list_filter = ("level", "department")Exam Traps and Missing Points
نواقص مهمة مقارنة بالصفحة القديمة والامتحانات
- كانت مركزة على Authentication, Sessions, Permissions, Static Files.
- المحاضرة الأصلية Lecture 8 عن Models, Database, Migrations, Admin.
- تمت إضافة: Field types, relationships, ORM CRUD, admin registration, superuser, choices, timestamps.
- Final 2024 Django is based on MVT.
- Final 2024 Model appears in admin after registration in
admin.py. - Final 2024 Import model:
from members.models import Member. - Final 2024 After model changes:
makemigrationsthenmigrate. - Final 2025
Post.objects.all()retrieves all objects; capitalization matters. - Final 2025 Built-in admin requires superuser command
createsuperuser.
تصميم بسيط متوافق مع المحاضرة: Department + Student + Course.
class Department(models.Model):
name = models.CharField(max_length=100)
class Course(models.Model):
title = models.CharField(max_length=100)
code = models.CharField(max_length=10)
credit_hours = models.IntegerField()
description = models.TextField(blank=True)
class Student(models.Model):
name = models.CharField(max_length=100)
level = models.IntegerField(default=1)
department = models.ForeignKey(Department, on_delete=models.CASCADE)
courses = models.ManyToManyField(Course, blank=True)Lecture 08 - Exam Quiz
Models, migrations, ORM, admin - compiled from lecture + finals
Django architecture اسمها Model-View-Template. Model للبيانات، View للمنطق، Template للعرض.
استخدم
admin.site.register(ModelName) أو @admin.register(ModelName). التسجيل في settings.py إجابة خاطئة ظهرت كفخ.الموديل موجود داخل ملف
models.py في app اسمها members، لذلك الاستيراد الصحيح هو from members.models import Member.الأمر الذي يطبق التغييرات فعلياً على الـ database هو
migrate وهو غير موجود بالخيارات. makemigrations ينشئ ملفات الـ migration فقط. (تنويه: بعض نماذج الإجابات احتسبت C بالخطأ، لكن D هي الأصح).migrate يقرأ migration files ويطبقها على database. أما makemigrations فينشئ الملفات فقط.Student to Course علاقة many-to-many: الطالب له كورسات كثيرة، والكورس فيه طلاب كثير.
Model class يتحول إلى table، والـ fields تتحول إلى columns، والـ object يتحول إلى row.
الصحيح
Post.objects.all() بحرف صغير في objects. Python وDjango case-sensitive.دي نقطة أساسية في المحاضرة:
admin.py هو مكان تسجيل models للظهور داخل admin interface.migrate يطبق التغييرات، مش يعرضها. لو عايز تشوف حالة migrations استخدم showmigrations، ولو عايز SQL استخدم sqlmigrate.startproject ينشئ ملفات مثل settings.py, urls.py, asgi.py, wsgi.py، لكنه لا ينشئ templates folder تلقائيًا.الأمر الصحيح هو
python manage.py createsuperuser. لاحظ كمان إن manage.py مش mange.py.