آشنایی با QuerySet و Manager‌ ها در Django

با نام خدا و سلام. یه مقدار سرم خلوت تر شد و تصمیم بر این گرفتم به مقدار مطالب آموزشی در مورد Django‌ رو با شما همراهان عزیزم در میان بگزارم . 

خب برای دسترسی به اطلاعات پایگاه داده و تعامل با آن، Django با یک API‌ انتزاعی پایگاه داده ارایه شده که به شما امکان create ، Retrieve ، update و Delete‌ اشیا پایگاه داده را به‌اسانی می دهد. Object-relational Mapper  (ORM) ارایه شده توسط Django‌ با MySQL, PostgreSQL, SQLite, Oracle سازگاری دارد.

ساخت Object : 

با فرض آنکه یک Model  با نام Comments‌ داریم: 

new_comment  = Comment.objects.create(title = 'c title' , txt = 'c-txt')
مِتُد get() : 

به شما اجازه retrieve‌ کردن یک object به صورت single از پایگاه داده را می دهد. توجه کنید که این متد انتظار داره که کوئری شما یک نتیجه داشته باشد. اگر هیچ نتیجه ای برگشت داده نشود یک DoesNotExist به عنوان exception اعلام خواهد کرد. و اگر پایگاه داده بیش از ۱ نتیجه برگرداند یک exception‌با عنوان MultipleObjectsReturned اعلام خواهد کرد.

مِتُد all() :

 نکته: هر مدلی از Django دارای حداقل یک manager‌ می باشد که manager پیشفرض objects‌ نامیده می شود.

برای retrieve‌کردن تمام object ها تنها باید از متد all()  استفاده کرد.

استفاده از مِتُد filter()‌ :

خب همین اول کار با مثال پیش می ریم. می خوایم تمام  پست هایی که از سال ۲۰۱۵ انتشار یافتند را استخراج کنیم.

Post.objects.filter(publish__year=2015)

همچنین می توانید با چندین فیلد فیلتر کنید:

Post.objects.filter(publish__year=2015, author__username='admin')

الان دستور فوق تمام پست هایی که در سال ۲۰۱۵ انتشار یافتند و نویسنده شان admin‌ بوده را استحراج می کند.

استفاده از exclude : 

شما می توانید نتایج مشخصی را از querySet مورد نظرتان با استفاده از متد exclude() مستثنی کنید. برای مثال ما در کویری زیر تمام پست های منتشر در سال ۲۰۱۵ بجز آنهایی که عنوانشون با why شروع می شود را استخراج می کنیم.

Post.objects.filter(publish__year=2015).exclude(title__startswith='Why')
استفاده از order_by() :

شما می توانید نتایج را بر اساس فیلد های متفاوتی با استفاده از متد order_by() مرتب کنید. برای مثال تکه کد زیر تمام پست ها را بر اساس عنوانشون مرتب کرده و استخراج می کند:

 

Post.objects.order_by('title')

ترتیب به صورت صعودی است. اگر بخواید به صورت نزولی باشد کافیه از علامت منفی «-» استفاده کنید:

Post.objects.order_by('-title')
حذف کردن object‌ ها :

با دستور زیر می توان پست با id = 1 ‌را حذف کرد:

post = Post.objects.get(id=1) 
post.delete()
اما QuerySet ها چه زمانی ارزیابی می شوند؟

شما می توانید چندین فیلتر مورد نظرتان را روی یک QuerySet اعمال کنید و با پایگاه داده کاری ندارید تا زمانی که QuerySet ارزیابی شود. اما QuerySet تنها در موارد زیر ارزیابی می شود:

  •  The first time you iterate over them
  •  [When you slice them. for instance: Post.objects.all()[:3]
  • When you pickle or cache them 
  • When you call repr() or len() on them 
  • When you explicitly call list()on them
  • When you test it in a statement such as bool(), or , and, or if