✔️مدیریت فنی در گوگل - Kianoosh Mokhtarian
توی این قسمت از اپیزود طبقه 16، کیانوش مختاریان، مدیر و رهبر فنی در گوگل از مسیر جذاب خودش، از دانشگاه شریف تا کار در گوگل و نهایتاً بازگشت به ایران حرف میزنه
موضوعات جذاب گفتگو:
اهمیت یادگیری زبانهای مختلف برنامهنویسی و الگوریتمها تو دنیای واقعی
مهارتهای نرم و کار تیمی
نکات کلیدی برای موفقیت در فرآیند استخدام گوگل
اگه به مهندسی نرمافزار، توسعه فردی و کار در شرکتهای بزرگ علاقه داری، این گفتگو یه فرصت عالی برای یادگیری و الهام گرفتنه.
https://youtu.be/oXbVKzIt-gQ?si=sM37GBtw5JUGovj3
#گوگل #برنامهنویسی #مهندسی_نرمافزار #مصاحبه
✅ @Teachify | برنامه نویسی
توی این قسمت از اپیزود طبقه 16، کیانوش مختاریان، مدیر و رهبر فنی در گوگل از مسیر جذاب خودش، از دانشگاه شریف تا کار در گوگل و نهایتاً بازگشت به ایران حرف میزنه
موضوعات جذاب گفتگو:
اهمیت یادگیری زبانهای مختلف برنامهنویسی و الگوریتمها تو دنیای واقعی
مهارتهای نرم و کار تیمی
نکات کلیدی برای موفقیت در فرآیند استخدام گوگل
اگه به مهندسی نرمافزار، توسعه فردی و کار در شرکتهای بزرگ علاقه داری، این گفتگو یه فرصت عالی برای یادگیری و الهام گرفتنه.
https://youtu.be/oXbVKzIt-gQ?si=sM37GBtw5JUGovj3
#گوگل #برنامهنویسی #مهندسی_نرمافزار #مصاحبه
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤🔥2
✔️ فشردهسازی شرطها در پایتون با استفاده از all و any
گاهی نیاز دارید چندین شرط را همزمان بررسی کنید، اما نمیخواهید کدتان شلوغ و ناخوانا شود. اینجاست که توابع all و any به کمک شما میآیند!
فرض کنید میخواهید بررسی کنید که آیا تمام اعداد یک لیست مثبت هستند:
تابع all زمانی True برمیگرداند که همه شرایط درست باشند.
حالا اگر بخواهید بررسی کنید که آیا حداقل یکی از اعداد زوج است:
تابع any زمانی True برمیگرداند که حداقل یکی از شرایط درست باشد.
✅ @Teachify | برنامه نویسی
گاهی نیاز دارید چندین شرط را همزمان بررسی کنید، اما نمیخواهید کدتان شلوغ و ناخوانا شود. اینجاست که توابع all و any به کمک شما میآیند!
فرض کنید میخواهید بررسی کنید که آیا تمام اعداد یک لیست مثبت هستند:
numbers = [3, 7, 9, 12]
if all(num > 0 for num in numbers):
print("All numbers are positive!")
تابع all زمانی True برمیگرداند که همه شرایط درست باشند.
حالا اگر بخواهید بررسی کنید که آیا حداقل یکی از اعداد زوج است:
if any(num % 2 == 0 for num in numbers):
print("At least one number is even!")
تابع any زمانی True برمیگرداند که حداقل یکی از شرایط درست باشد.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👌1
✔️ ساخت توابع خاص با functools.partial در پایتون
قابلیت
فرض کنید تابعی دارید که دو عدد رو ضرب میکنه:
با استفاده از
این باعث میشه کد شما تمیزتر و کاراتر بشه.
✅ @Teachify | برنامه نویسی
قابلیت
functools.partial به شما کمک میکنه که از یک تابع موجود، نسخهای بسازید که برخی از ورودیهاش بهصورت پیشفرض تنظیم شده باشه. فرض کنید تابعی دارید که دو عدد رو ضرب میکنه:
from functools import partial
# تعریف تابع اصلی
def multiply(x, y):
return x * y
# ساخت یک تابع جدید که مقدار x همیشه 5 باشه
partial_func = partial(multiply, 5)
# استفاده از تابع جدید
print(partial_func(3)) # خروجی: 15
print(partial_func(10)) # خروجی: 50
با استفاده از
partial میتونیم یک نسخه جدید از تابع بسازیم که فقط یک عدد رو بگیره و مقدار x همیشه 5 باشه! این باعث میشه کد شما تمیزتر و کاراتر بشه.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8😎1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣36
🥱3
✔️ اضافه کردن و حذف عناصر از هر دو طرف لیست
اگر میخواهید عناصری را از هر دو طرف یک لیست اضافه یا حذف کنید، میتوانید از deque (صف دوطرفه) استفاده کنید. برخلاف لیستهای معمولی که فقط امکان اضافه یا حذف عناصر از یک طرف را میدهند، deque این امکان را فراهم میکند که از هر دو طرف لیست (چپ و راست) عناصر را مدیریت کنید.
این ویژگی زمانی که با دادههای بزرگ یا ساختارهایی مثل پشته و صف کار میکنید بسیار کاربردی است. برای استفاده از deque باید ماژول collections را وارد کنید. مثال زیر نشان میدهد که چطور میتوانید از این قابلیت بهره ببرید:
نتیجه این کد:
✅ @Teachify | برنامه نویسی
اگر میخواهید عناصری را از هر دو طرف یک لیست اضافه یا حذف کنید، میتوانید از deque (صف دوطرفه) استفاده کنید. برخلاف لیستهای معمولی که فقط امکان اضافه یا حذف عناصر از یک طرف را میدهند، deque این امکان را فراهم میکند که از هر دو طرف لیست (چپ و راست) عناصر را مدیریت کنید.
این ویژگی زمانی که با دادههای بزرگ یا ساختارهایی مثل پشته و صف کار میکنید بسیار کاربردی است. برای استفاده از deque باید ماژول collections را وارد کنید. مثال زیر نشان میدهد که چطور میتوانید از این قابلیت بهره ببرید:
from collections import deque
# Create a deque
queue = deque()
# Add elements to both ends
queue.append(10) # Add to the right end
queue.appendleft(5) # Add to the left end
# Remove elements from both ends
right = queue.pop() # Remove from the right end
left = queue.popleft() # Remove from the left end
print(f"Right end: {right}, Left end: {left}")
نتیجه این کد:
Right end: 10, Left end: 5
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
✔️ پورتهای پیشفرض برخی از پایگاه دادههای مهم
دیتابیس SQLite بدون پورت (فایلمحور است).
دیتابیس PostgreSQL با پورت 5432
دیتابیس MySQL/MariaDB با پورت 3306
دیتابیس Oracle با پورت 1521
دیتابیس SQL Server با پورت 1433
دیتابیس MongoDB با پورت 27017
✅ @Teachify | برنامه نویسی
دیتابیس SQLite بدون پورت (فایلمحور است).
دیتابیس PostgreSQL با پورت 5432
دیتابیس MySQL/MariaDB با پورت 3306
دیتابیس Oracle با پورت 1521
دیتابیس SQL Server با پورت 1433
دیتابیس MongoDB با پورت 27017
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
وقتی یک فیلد در دیتابیس بهعنوان کلید اصلی (Primary Key) تعریف میشود، به چه معناست؟
Anonymous Quiz
6%
این فیلد میتواند مقادیر تکراری داشته باشد، به شرط اینکه NOT NULL باشد.
15%
این فیلد همیشه باید به یک کلید خارجی (Foreign Key) در جدول دیگری ارجاع دهد.
70%
این فیلد همیشه NOT NULL و UNIQUE است.
10%
این فیلد مقادیر NULL را میپذیرد اما تضمین میکند سایر مقادیر UNIQUE باشند.
فردا مصاحبه دارم
پس فردا مصاحبه دارم
یه مصاحبه برای پریروز بود که کنسل کردن و تایمش رو گفتن اعلام میکنن که ممکنه اونم همین 2-3 روز دیگه باشه :))
پ.ن: هنوز قسمت نشده از فریلنسری دربیام بیرون :|
سوالاتی که ازم پرسیده میشه رو حتما براتون میذارم.
✅ @Teachify | برنامه نویسی
پس فردا مصاحبه دارم
یه مصاحبه برای پریروز بود که کنسل کردن و تایمش رو گفتن اعلام میکنن که ممکنه اونم همین 2-3 روز دیگه باشه :))
پ.ن: هنوز قسمت نشده از فریلنسری دربیام بیرون :|
سوالاتی که ازم پرسیده میشه رو حتما براتون میذارم.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍2
برنامه نویسی | Teachify
Finally after a week🥲 ✅ @Teachify | برنامه نویسی
دوستان این پروژه رو میتونید توی لینک زیر ببینید:
https://github.com/yousefvafaei/Django-Upload-Manager
حتما اگه وقتش رو داشتین تست کنین و نظراتتون رو برام بگین.
اگه کدهاش رو دیدین و براتون مفید بود ممنون میشم اگه star بدین.
https://github.com/yousefvafaei/Django-Upload-Manager
حتما اگه وقتش رو داشتین تست کنین و نظراتتون رو برام بگین.
اگه کدهاش رو دیدین و براتون مفید بود ممنون میشم اگه star بدین.
👍12❤1
ترب یه آگهی استخدام گذاشته و تکنولوژی های مورد استفاده اش رو گفته:
یکم خودتون رو محک بزنید :))
زبان برنامهنویسی: پایتون، جاوا اسکریپت.
فریمورک به ترتیب اهمیت: Django, React, Starlette, FastAPI, Flask.
ذخیره و بازیابی اطلاعات به ترتیب اهمیت: postgresql, elasticsearch, redis, mongo, MinIO, ClickHouse, Influx, Prometheus,
داشبورد: grafana, kibana, metabase, amplitude.
زیرساخت: docker, kubernetes.
کنترلپروژه: gitlab.
تست و دیپلوی: gitlab-ci.
لینک جابینجا
✅ @Teachify | برنامه نویسی
یکم خودتون رو محک بزنید :))
زبان برنامهنویسی: پایتون، جاوا اسکریپت.
فریمورک به ترتیب اهمیت: Django, React, Starlette, FastAPI, Flask.
ذخیره و بازیابی اطلاعات به ترتیب اهمیت: postgresql, elasticsearch, redis, mongo, MinIO, ClickHouse, Influx, Prometheus,
داشبورد: grafana, kibana, metabase, amplitude.
زیرساخت: docker, kubernetes.
کنترلپروژه: gitlab.
تست و دیپلوی: gitlab-ci.
لینک جابینجا
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🫡5🤗3
برنامه نویسی | Teachify
مسیر برگشت از مصاحبه 🥲 مصاحبه کننده در یک کلام عالی بود❤️ ✅ @Teachify | برنامه نویسی
توی این مصاحبه سوالات زیاد بود به خصوص pure python.
حتما سرفرصت براتون تا جایی که یادم میاد مینویسم
حتما سرفرصت براتون تا جایی که یادم میاد مینویسم
👍13❤1
✔️ تفاوت 3 نوع دیتاتایپ لیست، تاپل و ست در پایتون چیست؟
1. لیست (List)
تغییرپذیر (Mutable): میتوانید عناصر را اضافه، حذف یا تغییر دهید.
مرتب (Ordered): ترتیب عناصر همانطور که اضافه شدهاند حفظ میشود.
اجازه مقادیر تکراری: میتوانید مقادیر تکراری داشته باشید.
از براکت ([]) برای تعریف استفاده میشود.
2. تاپل (Tuple)
تغییرناپذیر (Immutable): پس از تعریف، نمیتوانید عناصر آن را تغییر دهید.
مرتب (Ordered): ترتیب عناصر حفظ میشود.
اجازه مقادیر تکراری: مانند لیست، میتوانید مقادیر تکراری داشته باشید.
کارایی بالاتر: به دلیل تغییرناپذیری، تاپلها سریعتر از لیستها هستند.
از پرانتز (()) برای تعریف استفاده میشود.
3. ست (Set)
تغییرپذیر (Mutable): میتوانید عناصر را اضافه یا حذف کنید.
بدون ترتیب (Unordered): ترتیب عناصر تضمینشده نیست.
بدون مقادیر تکراری: ست فقط مقادیر یکتا را ذخیره میکند.
از آکولاد ({}) برای تعریف استفاده میشود.
✅ @Teachify | برنامه نویسی
1. لیست (List)
تغییرپذیر (Mutable): میتوانید عناصر را اضافه، حذف یا تغییر دهید.
مرتب (Ordered): ترتیب عناصر همانطور که اضافه شدهاند حفظ میشود.
اجازه مقادیر تکراری: میتوانید مقادیر تکراری داشته باشید.
از براکت ([]) برای تعریف استفاده میشود.
my_list = [1, 2, 3, 3, 4]
my_list.append(5) # اضافه کردن عنصر
my_list[0] = 10 # تغییر مقدار
print(my_list) # خروجی: [10, 2, 3, 3, 4, 5]
2. تاپل (Tuple)
تغییرناپذیر (Immutable): پس از تعریف، نمیتوانید عناصر آن را تغییر دهید.
مرتب (Ordered): ترتیب عناصر حفظ میشود.
اجازه مقادیر تکراری: مانند لیست، میتوانید مقادیر تکراری داشته باشید.
کارایی بالاتر: به دلیل تغییرناپذیری، تاپلها سریعتر از لیستها هستند.
از پرانتز (()) برای تعریف استفاده میشود.
my_tuple = (1, 2, 3, 3, 4)
# my_tuple[0] = 10 # خطا: تغییرناپذیری
print(my_tuple[1]) # دسترسی به عنصر دوم: 2
3. ست (Set)
تغییرپذیر (Mutable): میتوانید عناصر را اضافه یا حذف کنید.
بدون ترتیب (Unordered): ترتیب عناصر تضمینشده نیست.
بدون مقادیر تکراری: ست فقط مقادیر یکتا را ذخیره میکند.
از آکولاد ({}) برای تعریف استفاده میشود.
my_set = {1, 2, 3, 3, 4}
my_set.add(5) # اضافه کردن عنصر
print(my_set) # خروجی: {1, 2, 3, 4, 5} (بدون تکرار و ترتیب مشخص)Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
This media is not supported in your browser
VIEW IN TELEGRAM
✔️ مقایسه زبانهای برنامهنویسی!!!
یک تحلیل جذاب از عملکرد زبانهای مختلف برنامهنویسی:
نکات مهم:
- زبان های Java و Kotlin عملکرد بسیار سریعی دارند؛ احتمالاً به دلیل تمرکز ویژه گوگل روی بهینهسازی این زبانها.
- زبان JavaScript در بین زبانهای تفسیری و JIT، از نظر سرعت عملکردی فوقالعاده دارد.
- زبان Python، در مقایسه با سایر زبانها، بدون استفاده از ابزارهایی مثل PyPy نسبتاً کندتر است.
📂 کدهای مربوط به این بررسی را میتوانید در مخزن زیر ببینید:
https://github.com/bddicken/languages
#برنامهنویسی
✅ @Teachify | برنامه نویسی
یک تحلیل جذاب از عملکرد زبانهای مختلف برنامهنویسی:
نکات مهم:
- زبان های Java و Kotlin عملکرد بسیار سریعی دارند؛ احتمالاً به دلیل تمرکز ویژه گوگل روی بهینهسازی این زبانها.
- زبان JavaScript در بین زبانهای تفسیری و JIT، از نظر سرعت عملکردی فوقالعاده دارد.
- زبان Python، در مقایسه با سایر زبانها، بدون استفاده از ابزارهایی مثل PyPy نسبتاً کندتر است.
📂 کدهای مربوط به این بررسی را میتوانید در مخزن زیر ببینید:
https://github.com/bddicken/languages
#برنامهنویسی
Please open Telegram to view this post
VIEW IN TELEGRAM
👌12👍1
✔️ تفاوت copy و deepcopy در پایتون!
کپی ساده (Shallow Copy):
وقتی یک کپی ساده از یک شیء میگیرید، فقط ارجاع به عناصر اصلی درون شیء ساخته میشه.
تغییر مستقیم روی مقادیر اصلی در کپی ساده تأثیر نمیذاره.
اما اگر عناصر تو در تو (مثل لیست داخل لیست) تغییر کنن، کپی هم تحت تأثیر قرار میگیره:
دیپ کپی (Deep Copy):
وقتی دیپ کپی میگیرید، یک کپی کامل از شیء و تمام زیرمجموعههای درونی اون ساخته میشه. به عبارت دیگه، حتی اشیای تو در تو هم جداگانه کپی میشن.
تغییر در عناصر تو در توی شیء اصلی، هیچ اثری روی دیپ کپی نداره.
✅ @Teachify | برنامه نویسی
کپی ساده (Shallow Copy):
وقتی یک کپی ساده از یک شیء میگیرید، فقط ارجاع به عناصر اصلی درون شیء ساخته میشه.
import copy
original_list = [1, 2, [3, 4]]
shallow_copy = copy.copy(original_list)
# تغییر در لیست اصلی
original_list[0] = 100
print("Original:", original_list) # [100, 2, [3, 4]]
print("Shallow Copy:", shallow_copy) # [1, 2, [3, 4]]
تغییر مستقیم روی مقادیر اصلی در کپی ساده تأثیر نمیذاره.
اما اگر عناصر تو در تو (مثل لیست داخل لیست) تغییر کنن، کپی هم تحت تأثیر قرار میگیره:
# تغییر در یک عنصر تو در تو
original_list[2][0] = 300
print("Original:", original_list) # [100, 2, [300, 4]]
print("Shallow Copy:", shallow_copy) # [1, 2, [300, 4]]
دیپ کپی (Deep Copy):
وقتی دیپ کپی میگیرید، یک کپی کامل از شیء و تمام زیرمجموعههای درونی اون ساخته میشه. به عبارت دیگه، حتی اشیای تو در تو هم جداگانه کپی میشن.
deep_copy = copy.deepcopy(original_list)
# تغییر در عنصر تو در تو
original_list[2][0] = 500
print("Original:", original_list) # [100, 2, [500, 4]]
print("Deep Copy:", deep_copy) # [1, 2, [300, 4]]
تغییر در عناصر تو در توی شیء اصلی، هیچ اثری روی دیپ کپی نداره.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
یکی از جنبه های اصلی ORM که معمولا نادیده گرفته میشه!
این جنبه اینه که ORM میتونه رفتار خاص هر پایگاه داده رو مدیریت کنه و توسعهدهنده رو از این پیچیدگیها بینیاز کنه.
از اونجایی که دیتابیسها اصول و رفتارهای خاص خودشون رو دارن، مثلاً:
گویشهای SQL یا SQL Dialect:
هر پایگاه داده (مثل MySQL، PostgreSQL یا Oracle) نسخه خاص خودش از SQL رو داره که ممکنه در جزئیات مثل نحوه نوشتن کوئری، نوع دادهها یا عملیات پیشرفته تفاوت داشته باشه. ORM این تفاوتها رو پنهان میکنه و شما میتونید با یک زبان واحد (مثل کدهای پایتون در SQLAlchemy یا Django ORM) کار کنید.
بهینهسازی عملکرد:
از اونجایی که ORM میدونه هر دیتابیس در چه چیزی قویتره (مثلاً PostgreSQL برای Queryهای پیچیده عالیه، ولی SQLite برای عملیاتهای سبک مناسبتره) و سعی میکنه بهینهترین کوئریها رو برای اون دیتابیس تولید کنه.
محدودیتهای خاص دیتابیسها:
مثلاً برخی دیتابیسها از ویژگیهای خاصی مثل Partial Indexes، Full Text Search یا JSON Fields پشتیبانی میکنن. ORMها اغلب این قابلیتها رو شناسایی کرده و ازشون استفاده میکنن.
مدیریت اتصال و تنظیمات خاص:
با استفاده از ORMها تنظیمات خاص دیتابیس مثل زمانبندی اتصالات، مدیریت تراکنشها و تنظیمات سطح دسترسی رو به طور خودکار انجام میشن.
در نتیجه با استفاده از ORM، نیازی نیست که توسعهدهنده خودش با پیچیدگیهای دیتابیس خاصی درگیر بشه. ORM این نقش رو بر عهده میگیره و به سیستم کمک میکنه که بفهمه دقیقاً با چه دیتابیسی سروکار داره و چطور باید باهاش رفتار کنه.
این یعنی، ORM فراتر از یک ابزار برای تبدیل اشیا به جداول عمل میکنه؛ بلکه یه مدیر هوشمند بین دیتابیس و برنامه است که باعث میشه توسعه نرمافزار راحتتر، سریعتر و سازگارتر با انواع دیتابیسها باشه.
✅ @Teachify | برنامه نویسی
این جنبه اینه که ORM میتونه رفتار خاص هر پایگاه داده رو مدیریت کنه و توسعهدهنده رو از این پیچیدگیها بینیاز کنه.
از اونجایی که دیتابیسها اصول و رفتارهای خاص خودشون رو دارن، مثلاً:
گویشهای SQL یا SQL Dialect:
هر پایگاه داده (مثل MySQL، PostgreSQL یا Oracle) نسخه خاص خودش از SQL رو داره که ممکنه در جزئیات مثل نحوه نوشتن کوئری، نوع دادهها یا عملیات پیشرفته تفاوت داشته باشه. ORM این تفاوتها رو پنهان میکنه و شما میتونید با یک زبان واحد (مثل کدهای پایتون در SQLAlchemy یا Django ORM) کار کنید.
بهینهسازی عملکرد:
از اونجایی که ORM میدونه هر دیتابیس در چه چیزی قویتره (مثلاً PostgreSQL برای Queryهای پیچیده عالیه، ولی SQLite برای عملیاتهای سبک مناسبتره) و سعی میکنه بهینهترین کوئریها رو برای اون دیتابیس تولید کنه.
محدودیتهای خاص دیتابیسها:
مثلاً برخی دیتابیسها از ویژگیهای خاصی مثل Partial Indexes، Full Text Search یا JSON Fields پشتیبانی میکنن. ORMها اغلب این قابلیتها رو شناسایی کرده و ازشون استفاده میکنن.
مدیریت اتصال و تنظیمات خاص:
با استفاده از ORMها تنظیمات خاص دیتابیس مثل زمانبندی اتصالات، مدیریت تراکنشها و تنظیمات سطح دسترسی رو به طور خودکار انجام میشن.
در نتیجه با استفاده از ORM، نیازی نیست که توسعهدهنده خودش با پیچیدگیهای دیتابیس خاصی درگیر بشه. ORM این نقش رو بر عهده میگیره و به سیستم کمک میکنه که بفهمه دقیقاً با چه دیتابیسی سروکار داره و چطور باید باهاش رفتار کنه.
این یعنی، ORM فراتر از یک ابزار برای تبدیل اشیا به جداول عمل میکنه؛ بلکه یه مدیر هوشمند بین دیتابیس و برنامه است که باعث میشه توسعه نرمافزار راحتتر، سریعتر و سازگارتر با انواع دیتابیسها باشه.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
✔️چگونه اطلاعات اضافی را در رابطههای ManyToMany جنگو ذخیره کنیم؟
در جنگو، روابط چند به چند بهصورت پیشفرض ساده هستند و تنها رابطه بین دو مدل را نگهداری میکنند. اما وقتی نیاز به ذخیره اطلاعات اضافی درباره این رابطه دارید (مثل تاریخ، وضعیت، یا توضیحات)، باید از ویژگی قدرتمند through استفاده کنید. بیایید با جزئیات این مفهوم را بررسی کنیم:
اگر بهصورت ساده از
در این حالت جنگو خودکار جدولی ایجاد میکند که تنها دو ستون دارد و شما نمیتوانید اطلاعات اضافه (مثل تاریخ انتشار یا نقش نویسنده) را ذخیره کنید.
| book_id | author_id |
وقتی نیاز دارید اطلاعات بیشتری در مورد رابطه ذخیره کنید، through به شما امکان میدهد یک مدل سفارشی برای جدول واسط بسازید. این مدل میتواند علاوه بر کلیدهای خارجی، فیلدهای اضافی هم داشته باشد.
فرض کنید میخواهید رابطه بین کتاب و نویسنده را ذخیره کنید و علاوه بر آن، تاریخ انتشار همکاری را نیز نگهدارید، کد شما به صورت تصویر پیوست شده خواهد بود.
ایجاد نویسنده و کتاب:
افزودن نویسنده به کتاب با اطلاعات اضافی:
حالا میتوانید اطلاعات رابطه را بخوانید:
#Django #Python
✅ @Teachify | برنامه نویسی
در جنگو، روابط چند به چند بهصورت پیشفرض ساده هستند و تنها رابطه بین دو مدل را نگهداری میکنند. اما وقتی نیاز به ذخیره اطلاعات اضافی درباره این رابطه دارید (مثل تاریخ، وضعیت، یا توضیحات)، باید از ویژگی قدرتمند through استفاده کنید. بیایید با جزئیات این مفهوم را بررسی کنیم:
اگر بهصورت ساده از
ManyToManyField استفاده کنید، جنگو خودش یک جدول واسط (Intermediate Table) برای مدیریت رابطه بین دو مدل ایجاد میکند که در تصویر مدل BookAuthor میباشد.در این حالت جنگو خودکار جدولی ایجاد میکند که تنها دو ستون دارد و شما نمیتوانید اطلاعات اضافه (مثل تاریخ انتشار یا نقش نویسنده) را ذخیره کنید.
| book_id | author_id |
وقتی نیاز دارید اطلاعات بیشتری در مورد رابطه ذخیره کنید، through به شما امکان میدهد یک مدل سفارشی برای جدول واسط بسازید. این مدل میتواند علاوه بر کلیدهای خارجی، فیلدهای اضافی هم داشته باشد.
فرض کنید میخواهید رابطه بین کتاب و نویسنده را ذخیره کنید و علاوه بر آن، تاریخ انتشار همکاری را نیز نگهدارید، کد شما به صورت تصویر پیوست شده خواهد بود.
ایجاد نویسنده و کتاب:
author = Author.objects.create(name="John Doe")
book = Book.objects.create(title="Python for Beginners")
افزودن نویسنده به کتاب با اطلاعات اضافی:
BookAuthor.objects.create(book=book, author=author, publication_date="2024-01-01")
حالا میتوانید اطلاعات رابطه را بخوانید:
relations = BookAuthor.objects.all()
for relation in relations:
print(f"{relation.author.name} wrote '{relation.book.title}' on {relation.publication_date}")
#Django #Python
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6