جانغو ORM و QuerySets

في هذا الدرس سنتعلم كيف يقوم جانغو بالإتصال بقاعدة البيانات وتحزين البيانات عليها .

ماهو QuerySets ؟

هو عبارة عن قائمة من الكائنات لنموذج معين كما تسمح لك بقراءة وترشيح البيانات من قاعدة البيانات .

دعونا نأخذ مثال على ذلك حتى نفهم العملية جيدا .

شيل جانغو 

قم بفتح الطرفية (ليس على موقع PythonAnywhere) واكتب الأوامر التالية :


(myvenv) ~/pyarab$ python manage.py shell

وسيكون تأثير الأمر :


(InteractiveConsole)
>>>

وهذا يعني أننا نتواجد على طرفية جانغو التفاعلية مثلها مثل شيل بايثون إلا أنها تمتاز بإضافات خاصة بجانغو وطبعا يمكننا إستعمال جميع أوامر بايثون هنا أيضا .

جميع الكائنات 

دعونا نقوم بتجريب عرض جميع مواضيع المدونة أولا ولفعل ذلك نقوم بمايلي :

>>> Post.objects.all()
Traceback (most recent call last):
File "<console>", line 1, in <module>
NameError: name 'Post' is not defined

أووه خطأ وهو يقوم بإخبارنا أنه لا يوجد أي مواضيع وهو على صواب لأنه يجب علينا أولا أن نقوم بإستدعائهم أولا


>>> from blog.models import Post

قمنا بإستدعاء نموذج Post من خلال blog.models دعونا نقوم بعرض المواضيع مجددا

>>> Post.objects.all()
[<Post: عنوان الموضوع 1>, <Post: عنوان الموضوع 2>]

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

إنشاء كائن

الأمر التالي يقوم بإنشاء كائن موضوع جديد على قاعدة البيانات


>>> Post.objects.create(author=me, title='عنوان الموضوع', text='النص')

من خلال هذا السطر نلاحظ أننا بحاجة إلى عنصر مهم وهو إسم الكاتب فنحن بحاجة إلى تمريره إلى متغير USER فكيف نقوم بذلك ؟

أولا يجب إستدعاء نموذج المستخدم أولا


>>> from django.contrib.auth.models import User

ولمعرفة جميع المستخدمين الموجودين على قاعجة البيانات :


>>> User.objects.all()
[<User: kader>]

أنه المستخدم المدير الذي قمنا بإنشاءه سابقا وسنقوم الأن بربطه بمتغير me


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

الأن يمكننا إنشاء موضوعنا


>>> Post.objects.create(author=me, title='عنوان الموضوع 3', text='النص')

جميل دعونا نتأكد من أن الموضوع تم إنشاءه بالفعل


>>> Post.objects.all()
[<Post: عنوان الموضوع 1>, <Post: عنوان الموضوع 2>, <Post: عنوان الموضوع 3>]

وكما تلاحظ تم إضافة موضوع جديد إلى القائمة

إضافة مواضيع أخرى

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

تصفية الكائنات 
الأمر الرائع الموجود في QuerySets هو إمكانية تصفية الكائنات ، دعونا نقوم أننا نريد البحث عن جميع مواضيع المكتوبة من طرف مستخدم معين سنقوم بإستخدام filter بدلا من All في Post.objects.all()


>>> Post.objects.filter(author=me)
[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>

أو ربما نريد البحث عن جميع المواضيع التي تحتوي على كلمة title في حقل العناوين


>>> Post.objects.filter(title__contains='title')
[<Post: Sample title>, <Post: 4th title of post>]

 ملاحظة : كما تلاحظون توجد علامتين __ بين title و contains حيث أن Django ORMيستخدم هذه القاعدة من أجل  فصل أسماء الحقول (“title”) و العمليات أو المرشحات  (“contains”)

يمكنك أيضا الحصول على جميع المواضيع المنشورة ونقوم بتصفيتها من خلال المواضيع التي تمتلك published_date التي قمنا بها سابقا


>>> from django.utils import timezone
>>> Post.objects.filter(published_date__lte=timezone.now())
[]

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


>>> post = Post.objects.get(title="Sample title")

ثم نقوم بنشره بواسطة دالة publish()

>>> post.publish()

مرة أخرى نبحث عن المواضيع المنشورة


>>> Post.objects.filter(published_date__lte=timezone.now())
[<Post: Sample title>]

 ترتيب الكائنات 

QuerySets تسمح لنا أيضا بترتيب المواضيع فدعونا نقوم بترتيبهم على حسب تاريخ إنشاءهم


>>> Post.objects.order_by('created_date')
[<Post: Sample title>, <Post: Post number 2>, <Post: My 3rd post!>, <Post: 4th title of post>]

ويمكننا عكس هذه القائمة بإضافة العلامة –


>>> Post.objects.order_by('-created_date')
[<Post: 4th title of post>, <Post: My 3rd post!>, <Post: Post number 2>, <Post: Sample title>]

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


>>> exit()

أرجوا أن تقوم بدعمنا عبر نشرك والاعجاب بالموقع

اترك تعليقاً

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

Post Navigation