ارث بری در مدل جنگو جنگو
03 Khordad 1402
0 نظر
98 : 3
ارث بری در مدل جنگو

تو پست قبلی با عنوان استفاده از UUID در مدل جنگو اومدیم و بجای ارث بری از models.Model از یک مدل دیگه به نام CommonModel ارث بری کردیم که قرار شد تو این مقاله توضیح بدم که چرا از این مدل ارث بری کردم.

 

چند تا فیلد هستن که بیشتر مواقع در همه مدل ها قرارشون میدیم

 

  1. status برای تعین وضعیت انتشار اون سطر
  2. visible : تعیین وضعیت مشاهده سطر
  3. published_time: تعیین تاریخ انتشار سطر
  4. created_at: تعیین تاریخ ایجاد سطر
  5. update_at: تعیین تاریخ بروزرسانی سطر
 

موارد بالا از اون فیلد هایی هستن که تو همه مدل هامون تکرار میشن پس چیکار کنیم که بتونیم از تکرار کد جلوگیری و در کنارش از ارث بری استفاده کنیم تا بتونیم مثل یک برنامه نویس حرفه ای طراحی کنیم. جواب خیلی سادست یک بدل انتزاعی تعریف میکنیم و فیلد های پرتکرارمون رو توش قرار میدیم و از اون به بعد بجای ارث بری از  models.Model از مدل انتزائی که ساختیم ارث بری میکنیم.

خب دست بکار میشیم.

 

class CommonModel(models.Model):
    class Status(models.TextChoices):
        DRAFT = 'DR', 'پیش نویس'
        PENDING = 'PE', 'بررسی'
        PUBLISH = 'PU', 'منتشر'
        TRASH = 'TR', 'زباله'
        ARCHIVE = 'AR', 'آرشیو'

    class Visible(models.TextChoices):
        PUBLIC = 'PU', 'عمومی'
        PRIVATE = 'PI', 'خصوصی'
        PROTECTED = 'PO', 'محافظت'

    status = models.CharField(
        max_length=2, choices=Status.choices,
        default=Status.PUBLISH, verbose_name='وضعیت انتشار')
    visible = models.CharField(
        max_length=2,
        choices=Visible.choices,
        default=Visible.PUBLIC, verbose_name='قابلیت مشاهده')
    published_time = models.DateTimeField(null=True)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='ایجاد در')
    update_at = models.DateTimeField(auto_now=True, verbose_name='بروزرسانی در')

    # def __str__(self):
    #     return self.name

    class Meta:
        abstract = True
  1. من اینجا از نام CommonModel استفاده کردم ، شما هر نامی که میخواید استفاده کنید.
  2. دو کلاس با نام های Status و Visible استفاده کردم تا بتونم Enum های خودم رو ایجاد کنم.

    کلاس Status برای تععین وضعیت انتشار سطرمون هست 

    کلاس Visible برای تعیین وضعیت قابل مشاهه بودن سطرمون

  3. سایر فیلد ها به ترتیب برای تاریخ انتشار ، تاریخ ایجاد و تاریخ بروزرسانی سطر هامون هست
  4. حتما دقت کنید که در کلاس Meta مقدار abstract را برابر با True قرار بدید تا کلاس مدلمون به شکل انتزائی (قرار دادی) در بیاد.

حالا برای استفاده از این سطر ها در مدلمون کافیه بجای ارث بری از  models.Model از مدل (CommonModel) انتزائی که ساختیم ارث بری کنیم تا سطر های موجود در CommonModel در دیتابیس مدلمون اضافه بشن.

چند قدم در چند راه

ابتدا وارد شوید یا ثبت نام کنید!

برای ثبت نظر، نقد ابتدا باید وارد شوید یا ثبت نام کنید.
سبد خرید