تعلم كيفية تحسين تصميم نموذج جانغو باستخدام أفضل الممارسات في إختيار الحقول، وتصميم قاعدة البيانات، وتقنيات الاستعلام، و الأكواد النظيفة، والاختبار الفعال، والتحسين المتقدم لمساعدتك في إنشاء تطبيقات ويب قابلة للتطوير والصيانة.
سنستكشف بعضًا من أفضل الممارسات الأساسية للعمل مع نماذج 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)
...
هذا كل شيء و آمل أن تكون هذه المدونة مفيدة لك في إعطائك فهمًا أفضل لأفضل ممارسات نموذج جانغو. حتى المرة القادمة، ابقَ آمنًا واستمر في التعلم!
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.