QuerySets

جنگو

سلام

در این قسمت می خواهیم APIهای مدل ها را واکاوی کنیم. در ابتدا قصد داریم ویوی مربوط به صفحۀ اصلی را بهبود بخشیم.

باید سه قسمت را درست کنیم.

  • نمایش تعداد پست های ارسالی در یک بورد.
  • نمایش تعداد تاپیک های ارسالی در یک بورد.
  • نمایش آخرین کاربری که پستی را ارسال نموده به همراه تاریخ و ساعت آن.

برای اینکار از ترمینال پایتون (و نه کدزنی مستقیم در برنامه) شروع می کنیم و سپس تغییرات لازم را در برنامه پیاده سازی می کنیم.

بهتر است پیش از استفاده از ترمینال پایتون برای تمام مدل های خود متد __str__ را اضافه کنیم.

boards/models.py (مشاهده کد کامل)

در مدل پست از کلاس و ابزار Truncator استفاده می کنیم. با این کار می توانیم رشته های طولانی را به سایز مشخصی (در اینجا 30 کاراکتر) محدود و کوتاه کنیم.

بسیار عالی! ترمینال پایتون را باز می کنیم.

سپس درون شل دستورات زیر را وارد می کنیم.

راحت ترین کار برای انجام 3 هدف قبلی این است که تعداد تاپیک های فعلی را به دست آوریم. به خاطر اینکه تاپیک ها و بوردها مستقیما با هم در ارتباط اند.

اما تعداد پست های یک بورد نیاز به کمی حقه دارد! چراکه پست ها مستقیما با یک بورد در ارتباط نیستند.

ما در اینجا تعداد 11 پست داریم اما تمام آن ها به بورد «Django» تعلق ندارند. برای این کار به شیوۀ زیر پست ها را فیلتر می کنیم.

استفاده از دو علامت آندرلاین (__) پشت سر هم در topic__board برای بهره برداری از روابط تعریف‌شده میان مدل های مختلف است.

جنگو میان پست، تاپیک و بورد پلی را ایجاد کرده و کوئری SQLای را می سازد تا صرفاً پست های متعلق به یک بورد خاص را نمایش دهد.

و حالا آخرین مأموریت ما آن است که آخرین پست ارسالی را مشخص کنیم.

و تمام…! حالا که همه چیز در شل پایتون درست کار می کند باید آن ها را به برنامۀ خود اضافه کنیم.

boards/models.py (مشاهده کد کامل)

دقت کنید که از self استفاده کرده ایم. برای اینکه این متد توسط بورد استفاده خواهد شد و به این معنا خواهد بود که ما از این مورد برای فیلتر کردن کوئری خود استفاده خواهیم کرد.

گام بعدی بروزرسانی قالب صفحۀ خانه برای نمایش اطلاعات جدید است.

templates/home.html

و خروجی به شکل زیر خواهد شد:

نکته خیلی مهم: اگر در قطعه کد بالا تمام بوردها دارای تاپیک نباشند صفحه خطا می دهد که راه بر طرف کردن آن در ادامۀ همین آموزش آمده است…

فرمان تست را اجرا می کنیم.

به نظر می رسد که با پیاده سازی جدید مشکل داریم و اگر هیچ پستی ارسال نشده باشد برنامه کرش و فروپاشی می کند.

templates/home.html

فرمان تست را دوباره اجرا می کنیم.

حل است!

من یک بورد جدید ولی بدون هیچ پیامی ایجاد کرده ام تا «پیام های خالی» را چک کنم.

حالا نوبت آن رسیده تا ویوی لیست تاپیک ها را بهبود دهیم.

طبق قولی که داده بودم می خواهم راه دیگری را برای نمایش تعداد پاسخ های یک پست معرفی کنم که از لحاظ پردازش و بار سرور به صرفه تر باشد.

مثل معمول با شل پایتون شروع می کنیم.

در اینجا از متد annotate در کوئری استفاده کرده ایم که با این کار یک ستون جدید به صورت موقتی و در هوا می سازیم.

این ستون جدید قرار است توسط topic.replies قابل دسترسی بوده و شامل تعداد پست های یک تاپیک باشد. فقط لازم است که یک ترمیم جزئی انجام دهیم چراکه تعداد پاسخ ها نباید شامل اولین پست (پست اصلی) شوند.

خیلی خوب این کار به راحتی قابل انجام است و کافی است از تعداد خروجی یک عدد کم کنیم.

دیگه چی از این بهتر؟!

boards/views.py (مشاهده کد کامل)

templates/topics.html (مشاهده کد کامل)

گام بعدی شمارش تعداد بازدیدهاست اما قبل از آن باید یک فیلد جدید را به مدل های قبلی خود اضافه کنیم که در بخش بعدی به آن پرداخته می شود.

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: مهاجرت

مطلب قبلی:ویوی پاسخ به پست

بدون دیدگاه

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

جنگو
پیکربندی گواهینامۀ https

سلام حالا می خواهیم برنامۀ خودمان را با گواهینامۀ https امن کنیم. ساده ترین کار برای انجام آن Let’s Encrypt است. قبل از Let’s Encrypt هرگز تنظیمات https به این راحتی نبوده و مهمتر اینکه اینکار کاملاً رایگان است. آن ها راه حلی به نام certbot را ارائه داده اند …

جنگو
پیکربندی سرویس ایمیل

سلام یکی از بهتر سرویس دهنده های ایمیل Mailgun با قابلیت ۱۲ هزار ایمیل رایگان در ماه است. به صورت رایگان ثبت نام کنید. برای اینکار باید آن را با سرویس دهندۀ دامین خود تنظیم کنید که در این آموزش از tamadon.org استفاده شده است. حالا اولین رکورد DNS را …

جنگو
پیکربندی NGINX

سلام کار بعدی که قرار است انجام شود؛ تنظیمان Nginx به شکلی است که پاسخگویی و سرویس دهی مربوط به فایل های استاتیک را خود انجام دهد و سایر درخواست ها را به Gunicorn بفرستد. یک فایل پیکربندی با نام boards را درون /etc/nginx/sites-available/ و با محتوای زیر اضافه می …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.