مقدمه


قبل از شروع این فصل، لازم است با نحوه کار پایگاه داده در جنگو و نقش مدل‌ها در این فرآیند آشنا شویم. از آنجا که اکثر برنامه‌های وب مدرن برای مدیریت و ذخیره‌سازی داده‌ها به یک پایگاه داده رابطه‌ای متکی هستند، جنگو نیز ابزاری قدرتمند و خودکار برای مدیریت این داده‌ها در اختیار توسعه‌دهندگان قرار می‌دهد.

قلب این سیستم، ORM جنگو (Object-Relational Mapper) است — یعنی مبدل شیء-رابطه‌ای — که اجازه می‌دهد با پایگاه داده، نه از طریق دستورات SQL، بلکه با استفاده از کلاس‌های پایتون کار کنیم. هر کلاس در این سیستم، یک مدل نامیده می‌شود و نماینده یک جدول در پایگاه داده است. هر فیلد در این کلاس، معادل یک ستون در جدول می‌باشد و روابط بین مدل‌ها (مثل ForeignKey یا ManyToMany) نیز معادل روابط بین جداول در دیتابیس هستند.

⚠️ یادآوری: خطای "You have 18 unapplied migration(s)"

همان‌طور که به یاد داریم، در هنگام اجرای پروژه با دستور python manage.py runserver، با پیام هشدار زیر مواجه می‌شدیم:

you have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions

این پیام به این معنی است که ساختار پایگاه داده حتی برای اپلیکیشن‌های داخلی جنگو، هنوز در دیتابیس اعمال نشده است. بدون اعمال این migrationها، بخش‌هایی مثل سیستم کاربران، ورود به پنل ادمین و مدیریت sessionها به درستی کار نخواهند کرد. برای رفع این هشدار و پیاده‌سازی ساختار اولیه پایگاه داده، باید سرور را با [Ctrl] + [C] متوقف کرده و دستور زیر را در ترمینال اجرا کنیم:

(venv) python manage.py migrate

با اجرای این دستور جنگو به صورت خودکار تمام migrationهای مربوط به اپلیکیشن‌های داخلی جنگو یا اپلیکیشن‌های ایجاد شده همانند coreapp و clientapp که در INSTALLED_APPS لیست شده‌اند را در پایگاه داده اعمال می‌کند. migrationهای مربوط به مدل‌های  اپلیکیشن‌های داخلی جنگو (مثل auth, admin, sessions و ...) از قبل در پکیج جنگو وجود دارند و نیازی به ساخت migration برای آن‌ها وجود ندارد.

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

اجرای migrate در ابتدای پروژه، فقط مدل‌های داخلی جنگو را پیاده‌سازی می‌کند اما این مرحله ضروری بوده و پایه‌ای برای کار با داده‌ها در آینده فراهم می‌کند.  همانطور که می‌بینیم، فقط migrationهای مربوط به اپلیکیشن‌های داخلی اعمال می‌شوند — چرا که هنوز مدلی برای coreapp و clientapp نساخته‌ایم و migrationی برای اپ‌ها وجود ندارد.

هر کدام از این اپلیکیشن‌ها مدل‌های داخلی دارند و migrationهای از پیش ساخته شده در خودشان دارند

  • auth ← مدل User, Group, Permission
  • admin ← مدل LogEntry
  • sessions ← مدل Session
  • contenttypes ← مدل ContentType

 پس از اجرای موفقیت‌آمیز، جداول لازم برای عملکرد صحیح جنگو در دیتابیس ایجاد شده و می‌توان بدون هشدار، سرور را دوباره اجرا نمود.

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
September 20, 2025 - 12:09:17
Django version 5.2.6, using settings 'tutorial.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/5.2/howto/deployment/