در این سوال میخواهیم مدلهای اصلی یک بلاگ را پیادهسازی کنیم.
پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:
در این سوال شما فقط با فایل models.py
که در پوشه blog قرار دارد، کار خواهید کرد.
شما باید ۳ مدل (model) به این فایل اضافه کنید:
۱. مدل نویسنده (Author
):
name
است که از جنس رشته با حداکثر طول ۵۰ کاراکتر است.۲. مدل پستِ بلاگ (BlogPost
):
title
: از جنس رشته با حداکثر طول ۲۵۰ کاراکتر است.body
: از جنس رشته با طول نامحدود است.author
: که یک کلید خارجی به یک نویسنده است که نویسنده پست را مشخص میکند.date_created
: از نوع DateTimeField
است که زمان دقیق ساخته شدن پست را نشان میدهد و توسط کاربر وارد نمیشود.۳. مدل نظر (Comment
):
blog_post
: این فیلد یک کلید خارجی به پستی است که این کامنت متعلق به آن است.text
: متن کامنت است که از نوع رشته با حداکثر طول ۵۰۰ کاراکتر میباشد.توجه: این مدلها باید به گونهای نوشته شوند که اگر پستی پاک شد همهی کامنتهای مربوط به آن پست نیز پاک شود. همچنین اگر نویسندهای پاک شد، همه پستهای آن نویسنده به همراه کامنتهایش پاک شود.
تابع کپی:
بعد از ساختن مدلهای بالا یک تابع به نام ()copy
به مدل BlogPost اضافه کنید. این تابع آرگومان ورودی ندارد و یک کپی از مدل موردنظر میگیرد. به این صورت که کل پست به همراه همه کامنتهایش را کاملاً کپی میکند. تاریخ پستِ کپی شده جدید، به تاریخ فعلی تغییر میکند. این تابع در نهایت id بلاگ پست جدید را باز میگرداند.
برای مثال اگر تنها یک نویسنده به نام محمد و یک پست با تاریخ ۱۸ مهر به همراه ۳ کامنت در پایگاه داده وجود داشته باشد، بعد از کپی شدن پست در تاریخ ۲۰ مهر، هنوز یک نویسنده در پایگاه داده هست ولی تعداد پستها ۲ و تعداد کامنتها ۶ خواهد بود (هر پست ۳ کامنت مجزا) که تاریخ پست جدید ۲۰ مهر است.
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
blog/models.py
هستید.
اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد.testsample.py
با روش تست کردن آشنا شوید.یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.