در این سوال میخواهیم مدلهای اصلی یک بلاگ را پیادهسازی کنیم.
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/14742/) دانلود کنید. ساختار این پروژه به شرح زیر است:
```
blog
├── manage.py
├── requirements.txt
├── blog
│ ├── admin.py
│ ├── apps.py
│ ├── <mark class="yellow" title="شما مجاز به تغییر این فایل هستید."> > models.py < </mark>
│ ├── tests.py
│ ├── views.py
│ ├── __init__.py
│ └── migrations
│ └── __init__.py
├── Challenge
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── __init__.py
└── tests
├── testsample.py
└── __init__.py
```
## توضیحات
در این سوال شما فقط با فایل `models.py` که در پوشه blog قرار دارد، کار خواهید کرد.
شما باید ۳ مدل (model) به این فایل اضافه کنید:
۱. مدل نویسنده (`Author`):
+ این مدل فقط دارای یک فیلد به نام `name` است که از جنس رشته با حداکثر طول ۵۰ کاراکتر است.
۲. مدل پستِ بلاگ (`BlogPost`):
+ این مدل دارای فیلدهای زیر است:
+ عنوان `title`: از جنس رشته با حداکثر طول ۲۵۰ کاراکتر است.
+ متن `body`: از جنس رشته با طول نامحدود است.
+ نویسنده `author`: که یک کلید خارجی به یک نویسنده است که نویسنده پست را مشخص میکند.
+ تاریخ ایجاد پست `date_created`: از نوع `DateTimeField` است که زمان دقیق ساخته شدن پست را نشان میدهد و توسط کاربر وارد **نمیشود**.
۳. مدل نظر (`Comment`):
+ این مدل دارای دو فیلد زیر است:
+ پست `blog_post`: این فیلد یک کلید خارجی به پستی است که این کامنت متعلق به آن است.
+ متن `text`: متن کامنت است که از نوع رشته با حداکثر طول ۵۰۰ کاراکتر میباشد.
**توجه:** این مدلها باید به گونهای نوشته شوند که اگر پستی پاک شد همهی کامنتهای مربوط به آن پست نیز پاک شود. همچنین اگر نویسندهای پاک شد، همه پستهای آن نویسنده به همراه کامنتهایش پاک شود.
**تابع کپی:**
بعد از ساختن مدلهای بالا یک تابع به نام `()copy` به مدل *BlogPost* اضافه کنید. این تابع آرگومان ورودی ندارد و یک کپی از مدل موردنظر میگیرد. به این صورت که کل پست به همراه همه کامنتهایش را کاملاً کپی میکند. تاریخ پستِ کپی شده جدید، به تاریخ فعلی تغییر میکند. **این تابع در نهایت id بلاگ پست جدید را باز میگرداند.**
*برای مثال اگر تنها یک نویسنده به نام محمد و یک پست با تاریخ ۱۸ مهر به همراه ۳ کامنت در پایگاه داده وجود داشته باشد، بعد از کپی شدن پست در تاریخ ۲۰ مهر، هنوز یک نویسنده در پایگاه داده هست ولی تعداد پستها ۲ و تعداد کامنتها ۶ خواهد بود (هر پست ۳ کامنت مجزا) که تاریخ پست جدید ۲۰ مهر است.*
## تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
```shell terminal terminal
python manage.py test
```
## نکات
+ حتماً قبل از ارسال حتما دستور زیر را در ترمینال اجرا کنید.
``` shell terminal terminal
python manage.py makemigrations
```
+ شما تنها مجاز به تغییر در `blog/models.py` هستید.
اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد.
+ فراموش نکنید که میتوانید با مطالعهی `testsample.py` با روش تست کردن آشنا شوید.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.