Django - کابین


همه چی از uber شروع شد. ایده ی خوبی که رانندگان را به مسافران وصل می‌کرد و هر کسی هر جایی بود به سرعت می‌توانست برای خودش تاکسی درخواست دهد. مدتی نگذشت که برنامه‌نویس های داخل کشور عزیزمان هم از این سرویس ایده گرفتند و شروع به پیاده سازی مشابه آن در ایران کردند. در حال حاضر چندین سرویس درخواست آنلاین تاکسی وجود دارد که در تهران و چند شهر دیگر مشغول سرویس دهی به مسافرین هستند و روز به روز هم گسترش بیشتری میابند و اشتغال‌زایی زیادی را نیز به وجود آورده‌اند. حالا با توجه به بازار داغ این سرویس ما نیز می‌خواهیم یک سرویس مشابه ایجاد کنیم. اسمش هم cabin گذاشته‌ایم. شما می‌توانید پروژه کابین رو از اینجا دانلود کنید.

همانطور که در فایل ها می‌بینید یک app به نام cabin وجو دارد. در فایل models.py هشت مدل به شرح زیر وجود دارد:

  • Account: اکانت که به یک مدل دیگر اعم از راننده یا مسافر یا مدیر سیستم وصل است و شامل فیلد های زیر است

    • first_name: نام شخص
    • last_name: نام خانوادگی شخص
    • email: ایمیل شخص
    • phone: شماره تلفن شخص
    • password: پسورد شخص
  • Admin: مدیر سیستم که دسترسی هایی خاصی به سیستم دارد

    • account: اکانت ادمین که اطلاعات او را نگه می‌دارد
  • Rider: مسافر

    • account: اکانت مسافر که اطلاعات او را نگه می‌دارد
    • x: طول جغرافیایی موقعیت مسافر
    • y: عرض جغرافیایی موقعیت مسافر
    • rating: امتیاز مسافر
  • Driver: راننده

    • account: اکانت راننده که اطلاعات او را نگه می‌دارد
    • x: طول جغرافیایی موقعیت راننده
    • y: عرض جغرافیایی موقعیت راننده
    • rating: امتیاز راننده
    • active: آماده به کار بودن با نبود راننده را نشان می‌دهد
  • Car: خودرو

    • owner: صاحب خودرو که یک راننده است
    • car_type: نوع کلاس خودرو
    • model: سال تولید خودرو
    • color: رنگ خودرو
  • RideRequest: درخواست سفر

    • rider: مسافر درخواست دهنده
    • x: طول جغرافیایی نقطه درخواست
    • y: عرض جغرافیایی نقطه درخواست
    • car_type: کلاس خودرو درخواست شده
  • Ride: سفر

    • pickup_time: (زمان شروع سفر(سوار کردن مسافر
    • dropoff_time: زمان پایان سفر
      • دو زمان بالا از نوع عدد صحیح و نشان‌دهنده تعداد ثانیه های گذشته از زمان تاسیس شرکت می باشند.
    • request: درخواست سفری که این سفر به آن مربوط می‌شود
    • car: خودرویی که این سفر با آن انجام شده است
    • rider_rating: امتیازی که راننده به مسافر داده است
    • driver_rating: امتیازی که مسافر به راننده داده است
  • Payment: پرداخت

    • ride: سفری که پرداخت برای آن انجام شده است
    • amount: مبلغ پرداخت شده برحسب تومان
    • status: وضعیت پرداخت

حال از شما می‌خواهیم پرس‌ و‌ جو (query) های زیر را روی مدل های بالا بنویسید.

حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!

۱. ورودی کل شرکت کابین (پولی که از طریق پرداخت وارد شرکت می‌شود)🔗

در اینجا status تاثیری ندارد و نتیجه را می‌توانید به صورت dict برگردانید.

{'income': value }
JSON

۲. کل مبلغ پرداخت شده توسط مشتری با id برابر با x🔗

{'payment_sum': value }
JSON

۳. تعداد راننده هایی که حداقل یک ماشین کلاس A دارند.🔗

  • در این سوال باید .count() از QuerySet مربوطه را بازگرانید که نتیجه یک عدد خواهد بود.

۴. لیست درخواست های سفرِ در انتظار (یعنی درخواست هایی که به هیچ سفری وصل نباشد)🔗

۵. لیست مسافرانی که مجموع مبلغ سفر هایشان بیشتر یا مساوی با t تومان است.🔗

۶. اکانتِ راننده ای که بیشترین تعداد ماشین را دارد. اگر تعداد ماشین ها یکسان بود راننده ای را بدهید که نام خانوادگی‌اش از نظر الفبایی کوچکتر است.🔗

  • در این سوال باید یک شیء از نوع Account بازگرانید که نتیجه مانند زیر خواهد بود:
    <Account: Account object>
    JSON

۷. لیست همه مسافرانی که حداقل یک سفر با ماشین کلاس A داشته اند به همراه یک ستون اضافه با نام n که تعداد سفر هایی که هر مسافر با ماشین کلاس A داشته است را نشان می‌دهد.🔗

۸. لیست ایمیل رانندگانی که حداقل یک ماشین با مدل x (توجه کنید که مدل با نوع متفاوت است!) یا به بالا دارند.🔗

خروجی نمونه:

<QuerySet [{'account__email': 'linda180@gmail.com'}, {'account__email': 'jacqueline859@gmail.com'}, {'account__email': 'benjamin780@gmail.com'},.....]>
Plain text

۹. لیست همه راننده ها و یک ستون اضافه شده به آن به نام n که نشان دهنده تعداد سفر های هر راننده است.🔗

۱۰. لیست اسم های کوچک همه راننده ها و تعداد سفر هایی (n) که راننده با آن آسم انجام داده است.🔗

  • بعضی راننده ها اسم های یکسانی دارند
    • برای مثال اگر دو راننده مختلف با اسم jack وجود داشته باشند که هر کدام ۵ سفر انجام داده باشند، در لیست زیر فقط یک بار اسم jack با ۱۰ سفر می‌آید.

خروجی نمونه:

<QuerySet [{'n': 41, 'account__first_name': 'aaron'}, {'n': 44, 'account__first_name': 'adam'}, {'n': 19, 'account__first_name': 'alan'},.....]>
Plain text

۱۱. لیست رانندگانی که حداقل یک ماشین با رنگ c (مثلا White) که مدلِ همان ماشین n (مثلا ۹۰) یا به بالا باشد (توجه کنید که مدل با نوع متفاوت است!)، دارند.🔗

  • در این لیست نباید راننده‌ی تکراری وجود داشته باشد.

۱۲. لیست رانندگانی که حداقل یک ماشین با رنگ c و یک ماشین مدل n یا به بالا(توجه کنید که مدل با نوع متفاوت است!) دارند.🔗

  • در این لیست نباید راننده‌ی تکراری وجود داشته باشد.
  • لزوما این دو ماشین یکسان نیست. ولی برای رنگ و مدل باید حداقل یک ماشین با شرایط گفته شده برای هر کدام وجود داشته باشد

۱۳. مجموع طول سفر هایی که در آن اسم راننده n (مثلا jack) و اسم مسافر m بوده است.🔗

{'sum_duration': value }
JSON

تذکرات:🔗

  • یک فایل به نام queries.py وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کد های خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید.
  • برای نمونه تابع query_0 در پاسخ به پرس و جویِ «لیست همه ی رانندگانی که رتبه‌ی آنها بیشتر از x است.» کامل شده است که شما نیز باید مشابه همین تابع بقیه توابع را کامل کنید.
    def query_0(x):
      q = Driver.objects.filter(rating__gt=x)
      return q
    Python
  • در سوالاتی که در صورت سوال مقداری به صورت متغییر ذکر شده است(مانند x در مثال بالا)، متغییر مورد نظر در آرگومان های ورودی تابع در نظر گرفته شده است. شما خود نباید آرگومان های ورودی تابع را تغییر دهید.
  • در تمام سوالات به جز سوالات ۱ تا ۳ و ۶ و ۱۳ و سوالاتی که خروجی نمونه برای آنها مشخص شده است، همان طور که ذکر شد، خروجی شما یک شیء از نوع QuerySet با المان هایی از جنس گفته شده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.
    • برای مثال اگر سوال گفته باشد «لیست ماشین هایی که....» خروجی شما به شکل زیر باید باشد:
      <QuerySet [<Car: Car object>, <Car: Car object>,.....]>
      Plain text
  • در سوالات دیگر نیز که خروجی مشخص شده است، باز نتیجه یک QuerySet است ولی شامل همه فیلد های مدل مورد نظر نمی‌شود و فقط فیلد های خواسته شده با نام خواسته شده باید در آن قرار داشته باشد.
  • در هیچ کدام از پرس و جوی های خواسته شده ترتیب مهم نیست.
  • منظور از نام برای رانندگان و مسافران first_name است.

فایل آپلودی🔗

یک فایل zip. که درون آن یک پوشه cabin وجود دارد که شامل یک فایل queries.py است. توجه کنید در صورتی که فایل‌های اضافی ارسال کنید، حذف خواهند شد.

<Your-zip-name>.zip
   └── cabin
        └── queries.py
Plain text