مهاجرت

جنگو

سلام

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

زمانی که فرمان python manage.py migrate را اجرا می کنیم؛ جنگو تمام فایل های مهاجرت را گرفته و شمای دیتابیس را ایجاد می کند. جنگو برای انجام مهاجرت از یک جدول به خصوص استفاده می کند که با نام django_migrations شناخته می شود. جنگو در این جدول تمام مهاجرت های پذیرفته شده را ثبت می کند.

اگر سعی کنیم دوباره دستور بالا را اجرا کنیم؛ جنگو متوجه می شود که به آخرین تغییرات مهاجرت کرده و بنابراین کار جدیدی انجام نمی دهد.

python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, boards, contenttypes, sessions
Running migrations:
  No migrations to apply.

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

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

class Topic(models.Model):
    subject = models.CharField(max_length=255)
    last_updated = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, related_name='topics')
    starter = models.ForeignKey(User, related_name='topics')
    views = models.PositiveIntegerField(default=0)  # <- here

    def __str__(self):
        return self.subject

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

قبل از اینکه بخواهیم در برنامۀ خود از این فیلد استفاده کنیم؛ ضروری است تا شمای دیتابیس خودمان را بروزرسانی کنیم.

python manage.py makemigrations

Migrations for 'boards':
  boards/migrations/0003_topic_views.py
    - Add field views to topic

دستور makemigrations به صورت خودکار فایل 0003_topic_views.py را ایجاد می کند. از  این فایل برای تغییر دیتابیس و اضافه کردن فیلد ویو استفاده می شود.

حالا به جنگو می گوییم که مهاجرت را آغاز و اعمال کند.

python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, boards, contenttypes, sessions
Running migrations:
  Applying boards.0003_topic_views... OK

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

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

from django.shortcuts import get_object_or_404, render
from .models import Topic

def topic_posts(request, pk, topic_pk):
    topic = get_object_or_404(Topic, board__pk=pk, pk=topic_pk)
    topic.views += 1
    topic.save()
    return render(request, 'topic_posts.html', {'topic': topic})

 

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

{% for topic in topics %}
  <tr>
    <td><a href="{% url 'topic_posts' board.pk topic.pk %}">{{ topic.subject }}</a></td>
    <td>{{ topic.starter.username }}</td>
    <td>{{ topic.replies }}</td>
    <td>{{ topic.views }}</td>  <!-- here -->
    <td>{{ topic.last_updated }}</td>
  </tr>
{% endfor %}

حالا یک تاپیک را باز کرده و چند بار آن صفحه را رفرش می کنیم. همانطور که مشاهده می شود با هر بار فروش به تعداد بازدیدهای صفحه افزوده میی شود.

در اینجا به پایان فصل ششم می رسیم. شما می توانید کد های مربوط به این فصل را از آدرس زیر دانلود کنید 🙂

http://tamadon.net/python/code/520-django-beginners-guide-part6.zip

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

 

مطلب بعدی: فصل بعدی: استراتژی ویوهای مبتنی بر کلاس

مطلب قبلی: QuerySets

بدون دیدگاه

دیدگاهتان را بنویسید

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

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

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

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

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

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

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

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