IS231 / Backend Python + Django / Lecture 08

Django Models, Database, Migrations and Admin

المحاضرة دي هي النقلة من صفحات بتعرض بيانات مؤقتة إلى تطبيق Backend حقيقي عنده Database. هنفهم يعني إيه Model، إزاي Django يحول Python class إلى Table، إمتى نستخدم makemigrations و migrate، وإزاي Admin و ORM بيسهلوا الشغل.

8
Chapters
12
Exam Qs
2021/24/25
Final Sources
01

ليه محتاجين Database؟

Persistence: البيانات تعيش بعد ما البرنامج يقفل

Without Database

  • البيانات اللي في variables بتعيش طول ما السيرفر شغال فقط.
  • لو عملت restart، البيانات المؤقتة بتضيع.
  • صعب تشارك نفس البيانات بين مستخدمين كتير بشكل منظم.
memory.py
student_list = ["Ali", "Mona"]
# after server restart, this list is gone

With Database

  • البيانات بتتخزن بشكل دائم داخل Tables.
  • تقدر تعمل Search, Filter, Update, Delete بسهولة.
  • نفس السجلات متاحة لأجزاء مختلفة من النظام.
idnameleveldepartment
1Ali2CS
2Mona2AI
امتحانيًا: Database Storage = Persistent and structured. Program Memory = Fast but temporary.
02

What Is a Django Model?

Python class describes stored data

Model = Blueprint for Data

الـ Model في Django هو Python class بيورث من models.Model. كل attribute جوه الكلاس بيتحول إلى Column في Database table، وكل object من الكلاس بيمثل Row.

Django CodeDatabase Meaning
class Student(models.Model)Table اسمه غالبًا students_student
name = models.CharField(...)Column
Student(name="Ali")Object / Row data
__str__Readable display فقط، مش Column
students/models.py
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.name
ليه بنورث من models.Model؟ عشان Django يعرف إن الكلاس ده Database model ويضيف له ORM abilities زي objects, save(), delete().
Where Do Models Live?

غالبًا الموديلات بتتكتب داخل models.py في app معينة، لأن كل app بتمسك جزء منطقي من النظام.

project tree
myproject/
├── manage.py
├── myproject/
└── students/
    ├── admin.py
    ├── apps.py
    ├── models.py      # models live here
    ├── views.py
    └── migrations/
03

Fields and Options

اختيار نوع العمود وقواعده

Common Field Types
FieldUse CaseExample
CharFieldنص قصير مثل name, code, departmentmax_length مهم جدًا
TextFieldنص طويل مثل description, notesغالبًا لا يحتاج max_length
IntegerFieldأرقام صحيحة مثل age, level, credit_hoursليس مناسبًا للنصوص الرقمية مثل phone
EmailFieldإيميل بمعنى واضحemail = models.EmailField(blank=True)
DateTimeFieldوقت وتاريخauto_now_add, auto_now
BooleanFieldTrue / Falseis_active
مهم: Django بيضيف id primary key تلقائيًا لو أنت معرفتش primary key بنفسك.
null, blank, default
  • null=True: قاعدة البيانات ينفع تخزن NULL.
  • blank=True: الفورم/الـ admin يسمح إن الحقل يتساب فاضي.
  • default=1: قيمة افتراضية لو المستخدم مدخلش قيمة.
field options
email = models.EmailField(blank=True)
level = models.IntegerField(default=1)
department = models.CharField(max_length=50)
choices and timestamps

choices بتخلي القيم controlled بدل ما كل واحد يكتب قيمة بشكل مختلف.

models.py
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)
04

Migrations Workflow

من model code إلى database table

What Are Migrations?

الـ Migrations هي ملفات Python بتسجل تغييرات شكل الـ Database: إنشاء جدول، إضافة عمود، تعديل نوع Field... إلخ. اعتبرها history منظمة لتغييرات الـ schema.

1
Edit model code
تعدل models.py وتضيف/تغير fields.
2
Run makemigrations
Django يعمل migration file بناءً على التغييرات، لكنه لا يغير database لسه.
3
Run migrate
Django يطبق ملفات migration على قاعدة البيانات فعليًا.
terminal
python manage.py makemigrations
python manage.py migrate
python manage.py showmigrations
python manage.py sqlmigrate students 0001
فخ متكرر: makemigrations ينشئ ملفات migration فقط. migrate هو اللي يطبقها على الـ database. سؤال 2025 بيحاول يبدل المعنيين.
Common Migration Problems
  • عدلت model ونسيت تعمل migrate.
  • أضفت field إجباري على table فيها data قديمة من غير default.
  • عدلت migration قديم بعد ما اتطبق.
  • نسيت تضيف app في INSTALLED_APPS قبل شغل models.
05

Relationships Between Models

الجداول الحقيقية مرتبطة ببعض

ForeignKey

Many-to-One: طلاب كتير ينتموا لقسم واحد.

ForeignKey
class Department(models.Model):
    name = models.CharField(max_length=100)

class Student(models.Model):
    department = models.ForeignKey(
        Department,
        on_delete=models.CASCADE
    )
OneToOneField

One-to-One: طالب واحد له profile واحد فقط.

OneToOne
class StudentProfile(models.Model):
    student = models.OneToOneField(
        Student,
        on_delete=models.CASCADE
    )
    phone = models.CharField(max_length=20)
ManyToManyField

Many-to-Many: الطالب يأخذ كورسات كثيرة والكورس فيه طلاب كثير.

ManyToMany
class Course(models.Model):
    title = models.CharField(max_length=100)

class Student(models.Model):
    courses = models.ManyToManyField(Course)
اختيار العلاقة: Department to Student = ForeignKey. Student to IDCard = OneToOneField. Student to Course = ManyToManyField.
06

Django ORM and CRUD

Object Relational Mapper: تكلم مع database بـ Python

ORM = Python بدل SQL في البداية

الـ ORM يخليك تتعامل مع records كأنها Python objects. Django يحول أوامرك إلى SQL خلف الكواليس.

Django shell examples
# 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.
07

Django Admin

واجهة جاهزة لإدارة البيانات

What Is Admin?

Django Admin هي built-in management interface بتسمح للـ admins يعملوا Add, Edit, Delete للـ records من غير ما تبني dashboard من الصفر.

1
Register the model in admin.py
لو ما سجلتش model، مش هيظهر في admin interface.
2
Run migrations
لازم tables تكون موجودة في database.
3
Create superuser
تحتاج username/password للدخول على /admin/.
students/admin.py
from django.contrib import admin
from .models import Student

admin.site.register(Student)
terminal
python manage.py createsuperuser
امتحانيًا: التسجيل يكون في admin.py وليس settings.py. وإنشاء admin user بالأمر createsuperuser وليس createuser.
Customize Admin with ModelAdmin

لو عايز الـ admin list تبقى أوضح، استخدم list_display, search_fields, list_filter.

admin.py
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")
08

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.
أسئلة متكررة من Finals
  • 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: makemigrations then migrate.
  • Final 2025 Post.objects.all() retrieves all objects; capitalization matters.
  • Final 2025 Built-in admin requires superuser command createsuperuser.
Mini Project Design

تصميم بسيط متوافق مع المحاضرة: Department + Student + Course.

models.py
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)
Q

Lecture 08 - Exam Quiz

Models, migrations, ORM, admin - compiled from lecture + finals

Q1 Final 2024
Django is based on which framework?
A
MVC
B
MVVM
C
MVT
D
None of the previous
الإجابة: C - MVT
Django architecture اسمها Model-View-Template. Model للبيانات، View للمنطق، Template للعرض.
Q2 Final 2024 / 2025
For a model to be visible in the admin interface it has to be registered in which file?
A
settings.py
B
admin.py
C
views.py
D
None of the previous
الإجابة: B - admin.py
استخدم admin.site.register(ModelName) أو @admin.register(ModelName). التسجيل في settings.py إجابة خاطئة ظهرت كفخ.
Q3 Final 2024
If you have a Django application named members, and a model named Member, what is a correct syntax to import the model?
A
from members.models import Member
B
import Member from members
C
import members.Member
D
None of the previous
الإجابة: A
الموديل موجود داخل ملف models.py في app اسمها members، لذلك الاستيراد الصحيح هو from members.models import Member.
Q4 Final 2024
When you have done changes in a model in Django, which command has to be executed in order to make the changes take effect in the database?
A
python manage.py runmigrations
B
python manage.py executemigrations
C
python manage.py makemigrations
D
None of the previous
الإجابة الصحيحة علمياً: D - None of the previous
الأمر الذي يطبق التغييرات فعلياً على الـ database هو migrate وهو غير موجود بالخيارات. makemigrations ينشئ ملفات الـ migration فقط. (تنويه: بعض نماذج الإجابات احتسبت C بالخطأ، لكن D هي الأصح).
Q5 Lecture Core
What does python manage.py migrate do?
A
Creates migration files only
B
Applies pending migrations to the database
C
Opens the admin panel
D
Creates a superuser
الإجابة: B
migrate يقرأ migration files ويطبقها على database. أما makemigrations فينشئ الملفات فقط.
Q6 Lecture Quick Quiz
Which relationship fits: one student can take many courses, and one course can have many students?
A
ForeignKey
B
OneToOneField
C
ManyToManyField
D
CharField
الإجابة: C
Student to Course علاقة many-to-many: الطالب له كورسات كثيرة، والكورس فيه طلاب كثير.
Q7 Lecture Core
In Django, each object created from a model usually represents ______ in the database.
A
One row
B
One database
C
One column
D
One migration folder
الإجابة: A
Model class يتحول إلى table، والـ fields تتحول إلى columns، والـ object يتحول إلى row.
Q8 Final 2025
Post.Objects.all() will retrieve all objects in the Post table. True or False?
A
True
B
False
الإجابة: B - False
الصحيح Post.objects.all() بحرف صغير في objects. Python وDjango case-sensitive.
Q9 Final 2025
We can register models in the admin.py file to view it in the administration site of Django. True or False?
A
True
B
False
الإجابة: A - True
دي نقطة أساسية في المحاضرة: admin.py هو مكان تسجيل models للظهور داخل admin interface.
Q10 Final 2025
"migrate" command in Django is used to show the changes happened in the database. True or False?
A
True
B
False
الإجابة: B - False
migrate يطبق التغييرات، مش يعرضها. لو عايز تشوف حالة migrations استخدم showmigrations، ولو عايز SQL استخدم sqlmigrate.
Q11 Final 2025
When you create a Django project on your computer, you will get a folder for your project with a specific content including templates file. True or False?
A
True
B
False
الإجابة: B - False
startproject ينشئ ملفات مثل settings.py, urls.py, asgi.py, wsgi.py، لكنه لا ينشئ templates folder تلقائيًا.
Q12 Final 2025
To create the admin user for Django admin, you write: python manage.py createuser. True or False?
A
True
B
False
الإجابة: B - False
الأمر الصحيح هو python manage.py createsuperuser. لاحظ كمان إن manage.py مش mange.py.