فرهاد که از این اوضاع نابسامان زندگی خسته شده است، تصمیم به مهاجرت میگیرد؛ ولی از آنجایی که به مقدار کافی، پول برای مهاجرت ندارد، تصمیم گرفت این مهاجرت را روی دادههای پروژهی خود پیادهسازی کند و آنها را از شر این زندگی نجات دهد.
ولی از آنجایی که به افسردگی ناشی از عدم مهاجرت مبتلا شده، به کمک شما برای انجام این کار نیاز دارد.
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/129727/) دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
```
migration
├── account
│ ├── admin.py
│ ├── apps.py
│ ├── fixtures
│ │ └── users.json
│ ├── forms.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── fixtures
│ │ └── articles.json
│ ├── __init__.py
│ ├── <mark class="yellow" title="این پوشه را تغییر دهید"> > migrations < </mark>
│ │ ├── <mark class="red" title="این فایل نباید تغییر کند"> > 0001_initial.py < </mark>
│ │ └── __init__.py
│ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > models.py < </mark>
│ ├── tests.py
│ └── views.py
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── Pipfile
├── Pipfile.lock
├── requirements.txt
└── tests
├── __init__.py
└── testsample.py
```
## پایگاهداده
اپلیکیشن `blog` فقط شامل یک مدل به نام `Article` است که این مدل شامل فیلدهای زیر میباشد:
%align_right_start%
+ `author` : نام کاربری نویسندهی مقاله
+ `title` : عنوان مقاله
+ `category` : عنوان دستهبندی مقاله
+ `body` : متن مقاله
+ `created` : زمان ایجاد مقاله (این فیلد به طور خودکار در زمان ایجاد مقاله جدید مقداردهی میشود.)
%align_end%
## ترمیم ساختار داده
* فیلد `author` باید به جای نام کاربری نویسنده به شئ *User* متناظر آن نویسنده اشاره کند (تضمین میشود مقدار فیلد برابر نام کاربری کاربر معتبر و موجود در پایگاه داده است.). همچنین در صورت حذف یک کاربر باید تمام مقالات نوشتهشده توسط آن کاربر حذف شود.
* فیلد `category` باید به شئ متناظر از مدل *Category* اشاره کند و در صورتی که آن شئ حذف شد باید برابر **null** قرار گیرد.
* برای این کار باید مدل *Category* را پیادهسازی کنید. این مدل باید شامل فیلدهای زیر باشد:
+ `title`: عنوان دستهبندی (از نوع **CharField** و حداکثر طول ۵۰)
+ `status`: فعال بودن دسته بندی (از نوع **BooleanField** و مقدار پیشفرض True)
دقت کنید مقالات فعلی ممکن است دستهبندیهای یکسانی داشته باشند. در نتیجه باید به شئ یکسانی از مدل *Category* اشاره کنند. همچنین فیلد `category` مقالات فعلی موجود در پایگاه داده بعد از اعمال مایگریشن باید برابر شئ از مدل *Category* شود که فیلد `title` آن برابر مقدار فعلی فیلد `category` باشد (برای درک بهتر این دو جمله به عکس زیر دقت کنید.).
![Migration](https://quera.ir/qbox/view/IlFJMXlJ9o/migration.png)
* فیلد جدید `updated` که از نوع **DateTimeField** است و بعد از هر بار تغییر شئ (فراخوانی تابع **save**) برابر زمان بروزرسانی میشود و برای مقالات فعلی برابر فیلد `created` است.
* فیلد جدید `published` که از نوع **DateTimeField** است و به صورت پیشفرض برابر زمان حال (`timezone.now`) است و برای مقالات فعلی برابر فیلد `created` است.
* فیلد جدید `status` که از نوع **CharField** است و میتواند برابر دو مقدار `p` و `d` باشد و به صورت پیشفرض برابر `d` است و حتما باید مقدار داشته باشد. (`p` به معنای منتشر شده یا `publish` و `d` به معنای پیشنویس یا `draft`) و برای مقالات فعلی برابر `p` است.
## تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
```shell terminal terminal
python manage.py test
```
## نکات
+ شما تنها مجوز ایجاد تغییرات در فایلهای `blog/models.py` و `blog/migrations` را دارید و **تمامی تغییرات دیگر شما** در فایلهای پروژه **نادیده گرفته خواهند شد.**
+ **توجه کنید که نباید داخل فایل** `blog/migrations/0001_initial.py` **تغییری ایجاد کنید.**
+ فراموش نکنید که میتوانید با مطالعهی `testsample.py` با روش تست کردن مدلها و مایگریشنها آشنا شوید.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.