في هذا الدرس سنتعلم كيف يقوم جانغو بالإتصال بقاعدة البيانات وتحزين البيانات عليها .
ماهو 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()