همه چی از uber شروع شد. ایده ی خوبی که رانندگان را به مسافران وصل میکرد و هر کسی هر جایی بود به سرعت میتوانست برای خودش تاکسی درخواست دهد. مدتی نگذشت که برنامهنویس های داخل کشور عزیزمان هم از این سرویس ایده گرفتند و شروع به پیاده سازی مشابه آن در ایران کردند. در حال حاضر چندین سرویس درخواست آنلاین تاکسی وجود دارد که در تهران و چند شهر دیگر مشغول سرویس دهی به مسافرین هستند و روز به روز هم گسترش بیشتری میابند و اشتغالزایی زیادی را نیز به وجود آوردهاند. حالا با توجه به بازار داغ این سرویس ما نیز میخواهیم یک سرویس مشابه ایجاد کنیم. اسمش هم cabin
گذاشتهایم. شما میتوانید پروژه کابین رو از اینجا دانلود کنید.
همانطور که در فایل ها میبینید یک app به نام cabin وجو دارد. در فایل models.py هشت مدل به شرح زیر وجود دارد:
حال از شما میخواهیم پرس و جو (query) های زیر را روی مدل های بالا بنویسید.
حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!
۱. ورودی کل شرکت کابین (پولی که از طریق پرداخت وارد شرکت میشود)🔗
در اینجا status تاثیری ندارد و نتیجه را میتوانید به صورت dict برگردانید.
۲. کل مبلغ پرداخت شده توسط مشتری با id برابر با x🔗
۳. تعداد راننده هایی که حداقل یک ماشین کلاس A دارند.🔗
- در این سوال باید
.count()
از QuerySet مربوطه را بازگرانید که نتیجه یک عدد خواهد بود.
۴. لیست درخواست های سفرِ در انتظار (یعنی درخواست هایی که به هیچ سفری وصل نباشد)🔗
۵. لیست مسافرانی که مجموع مبلغ سفر هایشان بیشتر یا مساوی با t تومان است.🔗
۶. اکانتِ راننده ای که بیشترین تعداد ماشین را دارد. اگر تعداد ماشین ها یکسان بود راننده ای را بدهید که نام خانوادگیاش از نظر الفبایی کوچکتر است.🔗
- در این سوال باید یک شیء از نوع Account بازگرانید که نتیجه مانند زیر خواهد بود:
۷. لیست همه مسافرانی که حداقل یک سفر با ماشین کلاس A داشته اند به همراه یک ستون اضافه با نام n
که تعداد سفر هایی که هر مسافر با ماشین کلاس A داشته است را نشان میدهد.🔗
۸. لیست ایمیل رانندگانی که حداقل یک ماشین با مدل x (توجه کنید که مدل با نوع متفاوت است!) یا به بالا دارند.🔗
خروجی نمونه:
۹. لیست همه راننده ها و یک ستون اضافه شده به آن به نام n
که نشان دهنده تعداد سفر های هر راننده است.🔗
۱۰. لیست اسم های کوچک همه راننده ها و تعداد سفر هایی (n
) که راننده با آن آسم انجام داده است.🔗
- بعضی راننده ها اسم های یکسانی دارند
- برای مثال اگر دو راننده مختلف با اسم jack وجود داشته باشند که هر کدام ۵ سفر انجام داده باشند، در لیست زیر فقط یک بار اسم jack با ۱۰ سفر میآید.
خروجی نمونه:
۱۱. لیست رانندگانی که حداقل یک ماشین با رنگ c (مثلا White) که مدلِ همان ماشین n (مثلا ۹۰) یا به بالا باشد (توجه کنید که مدل با نوع متفاوت است!)، دارند.🔗
- در این لیست نباید رانندهی تکراری وجود داشته باشد.
۱۲. لیست رانندگانی که حداقل یک ماشین با رنگ c و یک ماشین مدل n یا به بالا(توجه کنید که مدل با نوع متفاوت است!) دارند.🔗
- در این لیست نباید رانندهی تکراری وجود داشته باشد.
- لزوما این دو ماشین یکسان نیست. ولی برای رنگ و مدل باید حداقل یک ماشین با شرایط گفته شده برای هر کدام وجود داشته باشد
۱۳. مجموع طول سفر هایی که در آن اسم راننده n (مثلا jack) و اسم مسافر m بوده است.🔗
تذکرات:🔗
- یک فایل به نام
queries.py
وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کد های خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید.
- برای نمونه تابع
query_0
در پاسخ به پرس و جویِ «لیست همه ی رانندگانی که رتبهی آنها بیشتر از x است.» کامل شده است که شما نیز باید مشابه همین تابع بقیه توابع را کامل کنید.
- در سوالاتی که در صورت سوال مقداری به صورت متغییر ذکر شده است(مانند x در مثال بالا)، متغییر مورد نظر در آرگومان های ورودی تابع در نظر گرفته شده است. شما خود نباید آرگومان های ورودی تابع را تغییر دهید.
- در تمام سوالات به جز سوالات ۱ تا ۳ و ۶ و ۱۳ و سوالاتی که خروجی نمونه برای آنها مشخص شده است، همان طور که ذکر شد، خروجی شما یک شیء از نوع QuerySet با المان هایی از جنس گفته شده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.
- برای مثال اگر سوال گفته باشد «لیست ماشین هایی که....» خروجی شما به شکل زیر باید باشد:
- در سوالات دیگر نیز که خروجی مشخص شده است، باز نتیجه یک QuerySet است ولی شامل همه فیلد های مدل مورد نظر نمیشود و فقط فیلد های خواسته شده با نام خواسته شده باید در آن قرار داشته باشد.
- در هیچ کدام از پرس و جوی های خواسته شده ترتیب مهم نیست.
- منظور از نام برای رانندگان و مسافران
first_name
است.
فایل آپلودی🔗
یک فایل zip. که درون آن یک پوشه cabin
وجود دارد که شامل یک فایل queries.py
است. توجه کنید در صورتی که فایلهای اضافی ارسال کنید، حذف خواهند شد.