چالش ORM جنگو – spanning multivalued relationship

در رابطه های ManyToMany یا OneToMany استفاده کردن از spanning داخل filter به model دیگر این سوال رو ایجاد میکنه که هر دو شرط باید روی یک آبجکت اجرا شه یا هر کدام از شرط ها جدا؟ کد زیر توی مستندات جنگو روشن این موضوع رو نشون داده:

تکه کد ORM جنگو – Queryset slicing – سوال مصاحبه

آیا ORM جنگو با اجرای کد زیر به دیتابیس query میزند؟ اگر آره چند Hit دیتابیس داریم؟

ORM جنگو lazy است یعنی در هر حالتی به دیتابیس دسترسی نمیگیرد مگر اینکه بخواهد queryset را کامل از دیتابیس بگیرد. درحالتی که از slicing پایتون برای یک queryset استفاده می کنیم ORM یک queryset جدید برمیگردونه و اون رو اجرا نمیکنه. یعنی توی خط اول به دیتابیس Hit نداریم. قاعدتا باید توی خط دوم هم همین باشه اما slicing پایتون با step استثنا هست و توی خط دوم یه Hit به دیتابیس داریم.

تکه کد – سوال مصاحبه

کدهای زیر با هم چه تفاوتی دارند؟

در شرط اول QuerySet اجرا نشده و فقط یک دستور از دیتابیس گرفته شده که آیا این queryset عضوی دارد یا خیر. جنگو این بررسی رو در بهینه ترین و کوتاه ترین حالت انجام میده و از حالت دوم که queryset رو اجرا کرده کمی سریع تره. نکته اینه که در حالتی که میدونیم کهم در هر صورت در ادامه برنامه قراره my_queryset رو اجرا کنیم (چه عضو داشته باشه چه نه) بهتره که از حالت دوم استفاده کنیم که دیگه یک بار اضافه از exists استفاده نکرده باشیم. چون همینطور که میدونیم اگر my_queryset رو از دیتابیس بیگیریم دفعات بعدی دیگه از دیتابیس نمیگیریم و cache میشه.

همین داستان رو برای تابع contains() هم داریم.

مشکل N+1 – سوال مصاحبه (دوم)

کد زیر چند Hit دیتابیس دارد؟

همچنان N+2!!!

حتی با وجود اینکه از prefetch_related استفاده شده است دوباره در داخل حلقه به N دسترسی مجدد به دیتابیس وجود دارد. چرا که prefetch_related بالا برای Pizaa.objects.all بوده ولی پایین از filter استفاده کردیم که ORM جنگو دسترسی بالایی را در نظر نمیگیرد و دوباره query میزند. اتفاقا بدتره چرا که یه query بالا هم اضافی هست. راه حل زیر درست میشه:

یا

ارثبری از مدلهای جنگو چه حالاتی دارد

ارثبری از مدلهای جنگو بستگی به این نکته دارد که آیا مدل فرزند و مدل پدر هر دو دارای جدولهای دیتابیس جداگانه ای هستند یا خیر؟ آیا کلاس پدر فقط برای این است که یک سری فیلد و متد و استاندارد برای فرزندان تعریف کند و اصلا خودش جدول دیتابیس نیست یا نه؟ آیا پدر و فرزند هر دو جدول دیتابیس هستند و فقط ارتباط یک به یک یا چند به چند دارند؟ با توجه به این سوالات حالات متفاوتی وجود دارد

Abstract Base Model Inheretence

ارثبری abstract در این روش کلاس پدر یک سری پارامتد و متد تعریف میکند و فقط برای به ارث برده شدن توسط فرزندان است و اصلا خودش جدول دیتابیس ندارد و اصلا استفاده دیگری ندارد و از آن هیچ instance ای هم ساخته نمی شود.

Multi-table inheritance

در این روش هر دو کلاس دارای جدول دیتابیس هستند و جداگانه Manager دارند و استفاده می شوند. به صورت implicit بین آنها ارتباط OneToOne شکل میگیرد و می توان به همدیگر هم دسترسی داشت. می توان به صورت explicit آن ارتباط به ManyToMany تغییر داد.

Proxy Model

در این حالت کلاس فرزند پارامتد و داده جدیدی به کلاس پدر اضافه نمی کند و فقط رفتار کلاس پدر را تغییر می دهد یعنی متدهای جدیدی تعریف می کند نه اینکه فیلد اضافه کند. مثلا Manager پیشفرض را تغییر میدهد یا یک Manager دوم هم برای پدر تعریف می کند. در این حالت کلاس Proxy به دیتای پدر دسترسی دارد.

Multiple Inheretence

چطوری توی جنگو مدل رابطه IS-A ایجاد کنیم؟

فرض کنید یک مدل ساختیم به اسم Place که داری آدرس و مشخصات یک مکان رو داره اون وقت یک مدل میخایم بسازیم به اسم Restaurant خوب بنظر منطقیه که تمام اون فیلدهایی که توی Place تعریف کردیم رو اینجا هم تعریف کنیم؟ نه میشه از Inheritance استفاده کرد. یک راه بهتر ایجاد رابطه IS-A هست چون restaurant is a place و این کار رو با django.db.models.OneToOneField انجام میدیم. که البته با ارث‌بری هم میشد انجام داد در واقع Inheritance به صورت implicit یک IS-A relationship هست.

lazy relationship تو ORM جنگو

اگر توی یک کلاس یک رابطه با کلاس دیگه ای که هنوز تعریف نشده بسازیم بهش میگیم lazy relationship مثل

چون کلاس Book بالاتر تعریف شده بنابراین کلاس Publisher دیده نمیشه و اگه توی ForeignKey کلاس Publisher رو توی دابل کوتیشن نزاریم ارور میگیریم و اینکه گذاشتیم توی دابل کوت “” یعنی گفتیم هنوز تعریف نشده و به این میگن lazy relationship

Hook چیه؟

توی برنامه نویسی شی‌گرا یا OOP که میشه از ارث‌بری استفاده کرد یکی از قابلیتهایی که مخصوصا توی کدهای فریم ورک ها میبینید اینه که توی یک کلاس یک متد تعریف شده و بدنه متد خالیه و عملا این رو گذاشتن که کلاس فرزند بتونه اون رو overwrite بازنویسی کنه که یا قابلیتهایی بهش اضافه کنه یا رفتار متد رو تغییر بده که به متدها میگن Hook.

مثلا توی کلاس BaseModel توی جنگو که کلاس Django.db.models.Model از اون ارثبری کرده یه سری متد وجود داره که میشه بازنوسی کرد مثلا با بازنوسی متد save() وقتی که مدل قراره توی جدول دیتابیس ذخیره میشه، این تابع اجرا میشه که میتونیم توی کلاس مدل اون رو بازنویسی کنیم که رفتارش رو عوض کنیم مثلا قبل از اینکه ذخیره کنه یه خط لاگ هم بندازه. توی این کلاس hook های زیر هم هستن

pre_save()

post_save()

__init__()

delete()

pre_delete()

post_delete()

__str__()

,…

باندهای موسیقی جدید

امروز با چند تا باند موسیقی جوان آشنا شدم و با شنیدن چند آهنگ از هر کدام واقعا لذت بردم. اونایی که برام جالب بود رو مینویسم و یه سرچی رو هر کدوم کردم که به نظرم شمام اگه بهترین آهنگ هرکدوم رو بشنوین خوشتون میاد.

1. Black Midi: این گروه به خاطر صدای تجربی و ترکیب ژانرها شناخته می‌شد و در صحنه موسیقی مستقل به سرعت شهرت پیدا کرده بود. ساختارهای پیچیده و اجراهای زنده پرانرژی آنها باعث جذب توجه بسیاری شد.

2. Fontaines D.C.: این گروه پست-پانک ایرلندی به خاطر موسیقی خام و انگیزه‌ای خود شناخته می‌شد. آلبوم “Dogrel” آنها به موفقیت‌های بزرگی دست یافت و نشان می‌دهد که آنها برای ادامه موفقیت آماده‌اند.

3. Japanese Breakfast: با اجراهای رویایی و عمیق خود، Japanese Breakfast به خاطر موسیقی پاپ مستقل خود شناخته می‌شد. آلبوم “Jubilee” آنها مورد تحسین قرار گرفت و نشان می‌دهد که این گروه توانایی دارد تا به موفقیت بیشتری دست پیدا کند.

4. Haim: با وجود اینکه Haim دقیقاً گروه‌های جوانی نبودند، اما با موسیقی پاپ-راک آنها، به تدریج جلب توجه می‌کردند. همسازی‌های آنها و ترانه‌نویسی مورد تحسین بود و آنها پتانسیل تبدیل شدن به ستارگان آینده را داشتند.

5. Squid: این گروه مستقل اهل انگلیس به خاطر نگرش اختراعی و نوآورانه‌شان به پست-پانک در حال جذب توجه بودند. آلبوم اول آنها با عنوان “Bright Green Field” پتانسیل آینده‌ای را به نمایش می‌گذاشت.

6. Arlo Parks: آرلو پارکس به خاطر موسیقی روحی و عمیق خود شناخته می‌شد. آلبوم او با عنوان “Collapsed in Sunbeams” توانست تجربیات شنوندگان را جلب کند و به آینده درخشانی اشاره کند.

7. The Linda Lindas: گروه جوان پانک راک “The Linda Lindas” به خاطر ترانه‌ای با عنوان “Racist, Sexist Boy” شهرت جهانی کسب کردند و در صحنه پانک و موسیقی مستقل به عنوان یک گروه نام‌آشنا شناخته می‌شدند.

8. Clairo: با صدای پاپ رویایی و متن‌های مرتبط خود، Clairo در صحنه موسیقی پاپ به نمایانی دست پیدا کرده بود. آلبوم او به نام “Immunity” پتانسیل آینده‌ای را نشان می‌دهد.

9. Idles: به خاطر پانک راک با انرژی بالا و متن‌های اجتماعی خود، Idles به تدریج مشهوریت و تحسین بیشتری جلب می‌کردند.

10. Koffee: از جامائیکا، Koffee با موسیقی رگه و دنس‌هال شیفته‌های بسیاری در سراسر جهان شده بود. او پتانسیل تبدیل شدن به یک ستاره جهانی در سبک موسیقی رگه را داشت.

شش مهر 1402

امروز یه اکانت OpenAI ساختم و مستنداتش رو مرور کردم. مستندات زیادی در مورد استفاده بهینه ازش وجود داره به علاوه API هاش رو توضیح داده که چطور میشه از API هاش استفاده کرد. سرویس عکس و voice داره و… بعدش توی ChatGPT اولین سوالمو پرسیدم و جواب زیر رو داد که بنظرم جالب میومد:

Creating an effective daily routine as a developer can significantly improve your performance, productivity, and learning capacity while minimizing distractions. Here’s a suggested daily routine to help you excel in your role and work towards becoming a senior developer:

1. Start with a Morning Routine:

Wake up early to ensure you have a fresh start to the day.

Engage in a brief morning exercise or meditation to boost your energy and focus.

Eat a healthy breakfast to fuel your body and mind.

2. Prioritize Your Tasks:

Create a to-do list for the day with clear priorities.

Focus on high-priority tasks that contribute directly to your team’s goals and your personal growth.

3. Time Blocking:

Allocate specific time blocks for different tasks and stick to them.

Dedicate uninterrupted periods for coding and problem-solving.

Include breaks to prevent burnout, e.g., Pomodoro Technique (25 minutes of work, 5 minutes of rest).

4. Email and Communication Management:

Check emails and messages at specific times (e.g., morning and afternoon) rather than constantly.

Set clear boundaries for meetings and encourage asynchronous communication when possible.

5. Continuous Learning:

Dedicate time each day to learn something new.

Stay updated with industry trends and advancements.

Experiment with new technologies or tools to broaden your skill set.

6. Collaboration and Code Reviews:

Collaborate with colleagues and attend team meetings as needed.

Participate in code reviews to learn from others and improve your coding skills.

7. Avoid Multitasking:

Focus on one task at a time to maintain high-quality work.

Switching between tasks can lead to loss of concentration and productivity.

8. Documentation:

Maintain good documentation for your code and projects.

This helps you and your team understand and maintain the codebase effectively.

9. Regular Self-Assessment:

Reflect on your progress and performance regularly.

Identify areas for improvement and set goals to address them.

10. End-of-Day Review: – Wrap up your day by reviewing what you’ve accomplished. – Prepare a plan for the next day to hit the ground running.

11. Personal Projects: – Consider working on personal coding projects outside of work. – This can enhance your skills and showcase your abilities to potential employers.

12. Work-Life Balance: – Maintain a healthy work-life balance to avoid burnout. – Spend quality time with family and engage in hobbies to relax.

13. Networking and Mentorship: – Attend developer meetups, conferences, or online forums to network. – Seek out mentors who can provide guidance and help you grow in your career.

14. Continuous Improvement: – Always look for ways to optimize your routine and workflow. – Adapt to changes in the industry and technology landscape.

Remember that consistency is key to long-term success. Stick to your routine and adjust it as necessary to accommodate changes in your responsibilities and goals. By following a disciplined daily routine, you’ll be well on your way to becoming a senior developer while maintaining a healthy work-life balance.