نماذج جانغو: نصائح من أجل أكواد نظيفة وفعالة (أفضل ممارسات)

تعلم كيفية تحسين تصميم نموذج جانغو باستخدام أفضل الممارسات في إختيار الحقول، وتصميم قاعدة البيانات، وتقنيات الاستعلام، و الأكواد النظيفة، والاختبار الفعال، والتحسين المتقدم لمساعدتك في إنشاء تطبيقات ويب قابلة للتطوير والصيانة.

سنستكشف بعضًا من أفضل الممارسات الأساسية للعمل مع نماذج Django🙌.

باستخدام بايثون يمكنك إنشاء مجموعة واسعة من التطبيقات بدءًا من البرامج النصية البسيطة إلى غاية تطبيقات الويب المعقدة باستخدام جانغو.

ما هو نموذج جانغو؟ و لماذا نتبع أفضل الممارسات في كتابة النماذج؟

نموذج Django هو مخطط يسمح للمطورين بالتفاعل مع قواعد البيانات باستخدام كود بايثون (باستخدام الفئات والتوابع) بدلاً من كتابة أكواد SQL. و من خلال اتباع أفضل الممارسات عند كتابة النماذج، يمكننا التأكد من أن الكود الخاص بنا فعال وآمن وقابل للصيانة.

كما يساعدنا هذا على إنشاء تطبيقات قوية وموثوقة. بالإضافة إلى ذلك، يمكن أن يساعدنا اتباع أفضل الممارسات في تجنب المخاطر الشائعة والتأكد من أننا نقوم بتحسين الكود الخاص بنا من أجل الأداء.🤗
لذلك دعونا نبدأ بها،

اجعل نماذجك بسيطة وواضحة

يجب أن تصف النماذج حقول واضحة في قاعدة البيانات ويجب أن تحتوي فقط على الحقول الضرورية. تجنب إضافة الحقول أو التوابع غير الضرورية. على سبيل المثال:

class BlogPost(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    publication_date = models.DateTimeField(auto_now_add=True)

في هذا المثال، يحتوي نموذجBlogPost على أربعة حقول ضرورية فقط لتخزين المعلومات اللازمة حول منشور مدونة.

الحقول عبارة عن CharField للعنوان و TextField للمحتوى، ويتم تعريفها بالحد الأدنى من المعلمات الضرورية.

أما حقل ForeignKey الخاص بالمستخدم يضمن أن كل مشاركة في المدونة مرتبطة بمؤلف ما، ولكنها لا تنشئ علاقة معقدة للغاية بين النماذج. وهذا يجعل النموذج بسيطًا وسهل الفهم وسهل الاستخدام.

تسمية النموذج

يجب تسمية النماذج باستخدام الأسماء المفردة، وليس الجمع، وكتابتها باستخدام CamelCase.

فعلى سبيل المثال يجب إستخدام "Blog" بدلاً من "Blogs" و "BlogPost" بدلاً من "Blogposts".

تسمية الحقول

لتحديد العلاقات بين النماذج باستخدام حقول مثل ForeignKey وOne To One Key و ManyToManyField، يجب أن تكون أسماء الحقول على snake_case وأن تستخدم أسماء معبرة.

فعلى سبيل المثال: "blog_author" هي للعلاقة بين المدونة ومؤلفها.

تطبيق الفهرسة على حقل النموذج

الاستعلامات المستخدمة بشكل متكرر والتي تتطلب درجة عالية من الأداء، مثل مجموعات البيانات الكبيرة ذات التصفية المعقدة. فمن المهم اختيار الحقول المناسبة للفهرسة والحفاظ على عدد الفهارس عند الحد الأدنى.

ملاحظة✍️: يمكن أن تعمل الفهرسة على تحسين أداء الاستعلام. ويمكنه أيضًا إبطاء أداء عمليات الكتابة، مثل إنشاء السجلات وتحديثها وحذفها في قاعدة البيانات. بالإضافة إلى ذلك، يمكن أن تؤدي إضافة عدد كبير جدًا من الفهارس إلى عمليات بحث كبيرة على القرص، مما قد يؤدي إلى إبطاء أداء قاعدة البيانات.

استخدام help_text كوثائق

أداة مفيدة لتوفير وثائق توضيحية واضحة و موجزة لنماذج جانغو، والتي يمكن أن تساعد في تحسين الجودة الشاملة للكود وقابلية صيانته. على سبيل المثال،

class BlogPost(models.Model):
    title = models.CharField(max_length=100, help_text='Enter the title of the blog')

ترتيب الكتابة لنموذج جانغو

أولاً، تحتاج إلى إنشاء نموذج Django. يمكن القيام بذلك عن طريق إنشاء ملف Python جديد في تطبيق Django الخاص بك وإضافة الفئة التالية:

from django.db import models

class MyModel(models.Model):
  # حدد الحقول هنا

بعد إنشاء النموذج، تحتاج إلى تحديد الحقول التي سيحتوي عليها. يمكن القيام بذلك عن طريق إضافة حقول إلى الفئة. هناك العديد من أنواع الحقول المختلفة التي يمكنك استخدامها، مثل:

  • CharField لسلسلة من الأحرف
  • IntegerField لعدد صحيح
  • DateField لتاريخ
  • DateTimeField لتاريخ ووقت

بمجرد تحديد الحقول، تحتاج إلى حفظ النموذج. يمكنك القيام بذلك عن طريق تشغيل الأمر التالي في وحدة التحكم:

python manage.py makemigrations

سيؤدي هذا إلى إنشاء ملف migration جديد. ثم يمكنك تشغيل الأمر التالي لتطبيق التغييرات:

python manage.py migrate

بمجرد حفظ النموذج، تحتاج إلى إنشاء نموذج عرض. يمكن القيام بذلك عن طريق إنشاء ملف بايثون جديد في تطبيق جانغو الخاص بك وإضافة الفئة التالية:

from django.views.generic import ListView

class MyModelListView(ListView):
  model = MyModel

بعد إنشاء نموذج عرض، تحتاج إلى ربطه بتطبيق جانغو الخاص بك. يمكنك القيام بذلك عن طريق إضافة السطر التالي إلى ملف urls.py الخاص بك:

path('my-model/', MyModelListView.as_view(), name='my-model'),

بعد ربط نموذج العرض، يمكنك اختبار النموذج عن طريق زيارة URL في المتصفح.

فيما يلي مثال على ترتيب الكتابة لنموذج جانغو:

# models.py
from django.db import models

class MyModel(models.Model):
  name = models.CharField(max_length=255)
  age = models.IntegerField()

# views.py
from django.views.generic import ListView

class MyModelListView(ListView):
  model = MyModel

# urls.py
from django.urls import path

urlpatterns = [
  path('my-model/', MyModelListView.as_view(), name='my-model'),
]

سيؤدي هذا إلى إنشاء نموذج Django يسمى MyModel يحتوي على حقلين: name و age. سينشئ أيضًا نموذج عرض يسمى MyModelListView يعرض جميع سجلات MyModel.

يمكنك اختبار النموذج عن طريق زيارة URL التالي في المتصفح:

/my-model/

سيؤدي هذا إلى عرض قائمة بجميع سجلات MyModel.

و فيما يلي بعض النصائح لترتيب الكتابة لنموذج جانغو:

  • ابدأ بإنشاء نموذج بسيط مع الحد الأدنى من الحقول. يمكنك دائمًا إضافة المزيد من الحقول لاحقًا.
  • تأكد من تحديد الحقول بشكل صحيح. يمكن أن يؤدي استخدام نوع حقل غير صحيح إلى أخطاء.
  • ربط نموذج العرض بتطبيق Django الخاص بك. سيسمح لك هذا بعرض سجلات النموذج في المتصفح.
  • اختبر النموذج قبل استخدامه في التطبيق الخاص بك. سيساعدك هذا في اكتشاف الأخطاء وضمان عمل النموذج بشكل صحيح.

لا تستخدم null=True أو blank=True لـ BooleanField

يتم استخدام BooleanField لتمثيل قيمة صواب/خطأ و يسمح لها بأن تكون فارغة قاعدة البيانات، مما يؤدي إلى خلق غموض ويمكن أن يؤدي إلى سلوك غير متوقع لذلك تجنب ذلك.

حساب طول النموذج

استخدم ال ModelName.objects.count() لحساب طول قاعدة البيانات بدلاً من len(ModelName.objects.all()).

استخدم _id لجلب معرف المفتاح الخارجي

على سبيل المثال، إذا كان لدينا نموذج User يحتوي على حقل profile_id يشير إلى نموذج Profile، فيمكننا استخدام الكود التالي لجلب معرف المفتاح الخارجي للملف الشخصي للمستخدم:

from django.contrib.auth.models import User

user = User.objects.get(username='kader')

# Get the profile ID
profile_id = user.profile_id

print(profile_id)

سيؤدي هذا الكود إلى طباعة معرف الملف الشخصي للمستخدم.

يمكننا أيضًا استخدام الدالة get() لجلب معرف المفتاح الخارجي. تأخذ هذه الدالة كائنًا من نوع Model وقيمة المفتاح الخارجي وتعيد كائنًا من نفس النموذج مع تحديد المفتاح الخارجي.

على سبيل المثال، إذا كان لدينا نموذج Product يحتوي على حقل category_id يشير إلى نموذج Category، فيمكننا استخدام الكود التالي لجلب معرف الفئة لمنتج معين:

from django.contrib.contenttypes.models import ContentType
from django.db.models import ObjectDoesNotExist

# Get the content type for the product model
product_type = ContentType.objects.get_for_model(Product)

# Get the product ID
product_id = 1

try:
    # Get the product
    product = product_type.get_object_for_id(product_id)

    # Get the category ID
    category_id = product.category_id

except ObjectDoesNotExist:
    category_id = None

print(category_id)

التحقق من الكائنات في النموذج

يمكن التحقق من وجود كائن في النموذج باستخدام الدالة exists(). تأخذ هذه الدالة كائنًا من نوع QuerySet وتعيد True إذا كان هناك سجلات في هذا الكائن، و False إذا لم يكن هناك سجلات.

على سبيل المثال، إذا كان لدينا نموذج User يحتوي على حقل username، فيمكننا استخدام الكود التالي للتحقق مما إذا كان المستخدم موجودًا أم لا:

from django.contrib.auth.models import User

# Get the user by username
user = User.objects.get(username='kader')

# Check if the user exists
exists = user.exists()

print(exists)

سيؤدي هذا الكود إلى طباعة True إذا كان المستخدم موجودًا، و False إذا لم يكن موجودًا.

يمكننا أيضًا استخدام الدالة filter() للتحقق من وجود كائن في النموذج. تأخذ هذه الدالة كائنًا من نوع QuerySet وشروط بحث وتعيد كائنًا جديدًا من نوع QuerySet يتضمن فقط السجلات التي تفي بشروط البحث.

على سبيل المثال، إذا كان لدينا نموذج Product يحتوي على حقل name، فيمكننا استخدام الكود التالي للتحقق مما إذا كان المنتج موجودًا أم لا:

from django.contrib.contenttypes.models import ContentType

# Get the content type for the product model
product_type = ContentType.objects.get_for_model(Product)

# Check if the product exists
product_exists = product_type.models.filter(name='iPhone').exists()

print(product_exists)

سيؤدي هذا الكود إلى طباعة True إذا كان المنتج موجودًا، و False إذا لم يكن موجودًا.

فيما يلي بعض النصائح للتحقق من وجود كائن في النموذج في جانغو:

  • استخدم الدالة exists() للتحقق من وجود كائن في النموذج.
  • استخدم الدالة filter() للتحقق من وجود كائن في النموذج باستخدام شروط بحث.

تحديد المفتاح الأساسي في النموذج

تحديد المفتاح الأساسي في النموذج يتم عن طريق إضافة primary_key إلى حقل النموذج. تشير هذه السمة إلى أن الحقل هو المفتاح الأساسي للنموذج.

على سبيل المثال، إذا كان لدينا نموذج User يحتوي على حقل id، فيمكننا تحديده كمفتاح أساسي باستخدام الكود التالي:

# Model definition
class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=255)
    email = models.EmailField()

سيؤدي هذا الكود إلى تحديد حقل id كمفتاح أساسي للنموذج.

خصائص المفتاح الأساسي:

  • يجب أن يكون كل جدول له مفتاح أساسي واحد فقط.
  • يجب أن تكون قيم المفتاح الأساسي فريدة.
  • لا يمكن أن تكون قيم المفتاح الأساسي فارغة.

أنواع المفتاح الأساسي:

  • مفتاح أساسي تلقائي: يتم إنشاء هذا النوع من المفاتيح الأساسي تلقائيًا بواسطة جانغو.
  • مفتاح أساسي مخصص: يمكن تحديد هذا النوع من المفاتيح الأساسي يدويًا بواسطة المطور.

مثال:

# Model definition
class User(models.Model):
    id = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=255)
    email = models.EmailField()

في هذا المثال، تم تحديد حقل id كمفتاح أساسي باستخدام نوع IntegerField.

ملاحظات:

  • يمكن تحديد أكثر من حقل كمفتاح أساسي للنموذج. في هذه الحالة، يجب أن تكون جميع القيم الفريدة.
  • يمكن استخدام المفتاح الأساسي في عمليات البحث والفرز.

استخدم القيود في حقول النموذج

استخدام القيود في حقول النموذج يتم لتحديد قواعد لقيم الحقل. تتوفر مجموعة متنوعة من القيود:

  • unique: يضمن أن تكون قيم الحقل فريدة.
  • null: يسمح بقيم فارغة.
  • blank: يسمح بقيم فارغة في النماذج القابلة للتحرير.
  • max_length: يحدد الحد الأقصى لعدد الأحرف التي يمكن تخزينها في الحقل.
  • min_length: يحدد الحد الأدنى لعدد الأحرف التي يمكن تخزينها في الحقل.
  • choices: يحدد مجموعة من القيم المسموح بها.
  • decimal_places: يحدد عدد الأرقام العشرية المسموح بها.
  • max_digits: يحدد عدد الأرقام المسموح بها.

على سبيل المثال، إذا كان لدينا نموذج User يحتوي على حقل username، فيمكننا استخدام القيد unique لضمان أن يكون كل اسم مستخدم فريدًا:

# Model definition
class User(models.Model):
    username = models.CharField(max_length=255, unique=True)

سيؤدي هذا الكود إلى منع المستخدمين من إنشاء أسماء مستخدمين متطابقة.

أنواع القيود:

  • قيود البيانات: تتحكم هذه القيود في البيانات التي يمكن تخزينها في الحقل.
  • قيود النموذج: تتحكم هذه القيود في كيفية تعامل النموذج مع الحقل.

مثال:

# Model definition
class User(models.Model):
    username = models.CharField(max_length=255, unique=True)
    email = models.EmailField(blank=True)

في هذا المثال، يسمح القيد blank بقيم فارغة في حقل email.

ملاحظات:

  • يمكن استخدام أكثر من قيد واحد في حقل واحد.
  • يمكن استخدام القيود لفرض قواعد محددة على بيانات النموذج.

فيما يلي بعض النصائح لاستخدام القيود في حقول النموذج:

  • استخدم القيود unique و max_length لضمان صحة بيانات النموذج.
  • استخدم القيود blank و null لتوفير مرونة في كيفية استخدام النموذج.
  • استخدم القيود choices لتحديد مجموعة من القيم المسموح بها.
  • استخدم القيود decimal_places و max_digits لتحديد دقة البيانات الرقمية.

تخزين الملفات باستخدام المسار المخصص

بتحديد مكان تخزين الملفات التي تم تحميلها ضمن MEDIA_ROOT. حيث يسمح لك ذلك بتنظيم الملفات وإدارتها وتقديمها بسهولة. يمكنك تحقيق ذلك باستخدام upload_to في حقل نموذج FileField أو ImageField .
على سبيل المثال:

def _upload_to(instance, filename):
    epoch_time = epoch_milliseconds()
    name, extension = os.path.splitext(filename)
    file = "{}_{}{}".format(name, epoch_time, extension)
    return "{}/{}".format(instance.__class__.__name__, file)
class Post(models.Model):
    banner_image = models.ImageField(upload_to=_upload_to) 
            ... 

هذا كل شيء و آمل أن تكون هذه المدونة مفيدة لك في إعطائك فهمًا أفضل لأفضل ممارسات نموذج جانغو. حتى المرة القادمة، ابقَ آمنًا واستمر في التعلم!


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading