Ninja Learn | نینجا لرن
1.27K subscribers
96 photos
36 videos
11 files
306 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
سلام رفقا 👋

تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏

کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه
همه رو جواب میدیم ☺️

https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6
🔥8
#پست_جدید

💎 تایپ هینت (Type Hint) در پایتون 💎

تایپ هینت (Type Hint) یا "نشانه‌گذاری نوع" در پایتون، روشی برای مشخص کردن نوع داده‌هایی هست که یه تابع می‌تونه بپذیره و برگردونه. این قابلیت از نسخه 3.5 به بعد به پایتون اضافه شده و به بهبود خوانایی و فهم کد کمک می‌کنه.

مثال‌های پایه‌ای از Type Hint:

در ادامه به برخی مثال‌های ساده و کاربردی اشاره می‌کنیم:

1️⃣ نشانه‌گذاری نوع آرگومان‌ها و نوع بازگشتی توابع

def greet(name: str) -> str:
return f"Hello, {name}"

def add(a: int, b: int) -> int:
return a + b


در این مثال، تابع greet یک آرگومان از نوع str میگیره و یه str برمی‌گردونه. تابع add دو آرگومان از نوع int میگیره و یک int برمی‌گردونه.


2️⃣ استفاده از انواع داده پیچیده‌تر

from typing import List, Dict

def get_names() -> List[str]:
return ["Alice", "Bob", "Charlie"]

def get_ages() -> Dict[str, int]:
return {"Alice": 30, "Bob": 25}


در اینجا، List[str] نشان‌دهنده لیستی از رشته‌ها و Dict[str, int] نشان‌دهنده دیکشنری‌ای هست که کلیدهاش رشته و مقادیرش عدد صحیح هستن.



3️⃣ استفاده از Optional

گاهی ممکنه یه تابع مقداری را برگردونه یا مقدار None برگردونه. در این مواقع از Optional استفاده می‌کنیم:

from typing import Optional

def find_item(items: List[str], item: str) -> Optional[int]:
try:
return items.index(item)
except ValueError:
return None


تابع find_item ممکنه یک عدد صحیح (int) یا None برگردونه.



4️⃣ استفاده از Union

زمانی که یه متغیر یا آرگومان می‌تونه چندین نوع داده مختلف داشته باشه، از Union استفاده می‌کنیم:

from typing import Union

def get_value(value: Union[int, str]) -> str:
if isinstance(value, int):
return f"The number is {value}"
else:
return f"The string is {value}"


در اینجا، آرگومان value می‌تونه از نوع int یا str باشه.



5️⃣ استفاده از Any

اگر نوع داده مشخص نیست یا می‌تونه هر نوع داده‌ای باشه، از Any استفاده می‌کنیم:

from typing import Any

def print_value(value: Any) -> None:
print(f"The value is {value}")


جمع‌بندی
تایپ هینت ها در پایتون به شما کمک می‌کنن تا کدهای خواناتری بنویسین و با استفاده از ابزارهای بررسی تایپ خطاهای تایپ رو قبل از اجرای کد پیدا کنید. این قابلیت می‌تونه به ویژه در پروژه‌های بزرگ و تیم‌های توسعه نرم‌افزار مفید باشه. با استفاده از type hint ها، می‌تونید کدهای خودتون رو مستندسازی کنید و اون ها رو قابل فهم‌تر کنید و آسون‌تر نگهداری کنید.


#پایتون #python

@ninja_learn_ir
🔥13
Ninja Learn | نینجا لرن pinned «سلام رفقا 👋 تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏 کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه همه رو جواب میدیم ☺️ https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6»
Ninja Learn | نینجا لرن
سلام رفقا 👋
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
خب رفقا

اکثرتون دوره DRF خواستید

بزودی یه دوره کاربردی و Practical از DRF واستون ضبط میکنیم ✌️

منتظر خبرای خوب باشید 😊

شبتون بخیر 🌹
👍14
دوستان برای دوره drf دوست دارید به عنوان تمرین چه پروژه ای بزنیم؟👀
Final Results
30%
سایت اگهی (مثل دیوار)
7%
وبلاگ
41%
سیستم ازمون انلاین
22%
سوشیال مدیا
🔥7
#پست_جدید

💎 فرق بین let ،const و var در جاوااسکریپت برای تعریف متغیر 💎

تو جاوااسکریپت، سه نوع کلیدواژه (Keyword) برای تعریف متغیرها استفاده میشه: var، let و const.

هر کدوم از این کلیدواژه‌ها رفتار و ویژگی‌های خاص خودشون رو دارن که در ادامه به توضیح و مقایسه اون ها با مثال‌های مختلف می‌پردازیم.

1️⃣ کلمه کلیدی var:

کلمه کلیدی var قدیمی‌ترین روش برای تعریف متغیرها در جاوااسکریپته. متغیرهایی که با var تعریف میشن دارای این ویژگی‌ ها هستن:


دامنه (Scope):
کلمه کلیدی var به صورت "function scope" هست، به این معنی که اگه داخل یک تابع تعریف بشه، فقط در داخل همون تابع قابل دسترسیه. خارج از توابع، متغیرهای var در سطح Global تعریف میشن.

در block scope (داخل {})، متغیرهای var به صورت local عمل نمی‌کنن و همچنان در سطح تابع یا Global تعریف میشن.

Hoisting:
متغیرهای var به بالای محدوده (scope) خودشون هوست میشن، به این معنی که میشه قبل از تعریف اونها ازشون استفاده کرد.

مثال:

console.log(a); // undefined
var a = 5;
console.log(a); // 5

if (true) {
var b = 10;
}
console.log(b); // 10


2️⃣ کلمه کلیدی let:

کلمه کلیدی let یکی از دو روش جدیدتر (ES6) برای تعریف متغیر هاست. متغیرهایی که با let تعریف میشن دارای این ویژگی‌ها هستن:

دامنه (Scope):
کلمه کلیدی let دارای "block scope" هست، به این معنی که فقط در داخل بلاکی (بین {}) که داخلش تعریف شدن قابل دسترسی هستن.

Hoisting:
متغیرهای let هویست نمیشن و در محدوده‌ی temporal dead zone (TDZ) تا زمانی که تعریف نشدن قابل دسترسی نیستند.

مثال:

if (true) {
let x = 10;
console.log(x); // 10
}
// console.log(x); // ReferenceError: x is not defined

console.log(y); // ReferenceError: y is not defined
let y = 5;
console.log(y); // 5



3️⃣ کلمه کلیدی const:

کلمه کلیدی const یک روش جدیدتر (ES6) دیگه برای تعریف متغیر هاست. متغیرهایی که با const تعریف میشن دارای این ویژگی‌ ها هستن:


دامنه (Scope):
متغیر های const هم مشابه let دارای "block scope" هستن.

Hoisting:
متغیر های const مشابه let هویست نمیشن و در TDZ تا زمانی که تعریف نشدن قابل دسترسی نیستن.


تغییر مقدار (Reassignment):
متغیرهای const نمی‌تونن دوباره مقداردهی بشن، به این معنیه که پس از تعریف، نمیشه مقدار جدیدی بهشون داد. این نکته برای آبجکت ها و آرایه‌ها به معنای تغییرناپذیریشون نیست بلکه فقط به معنای تغییرناپذیری رفرنس (Reference) اونهاست.

مثال:

const pi = 3.14;
console.log(pi); // 3.14

// pi = 3.15; // TypeError: Assignment to constant variable

if (true) {
const y = 10;
console.log(y); // 10
}
// console.log(y); // ReferenceError: y is not defined

const arr = [1, 2, 3];
arr.push(4); // این مجاز ه چون ما مرجع آرایه رو تغییر نمیدیم بلکه مقدار داخلش رو تغییر میدیم
console.log(arr); // [1, 2, 3, 4]

// arr = [5, 6, 7]; // TypeError: Assignment to constant variable



جمع‌بندی

var:
دارای function scope، متغیرها به بالای scope هویست میشن.

let:
دارای block scope، متغیرها در محدوده‌ی TDZ هستن و هویست نمیشن.

const:
دارای block scope، متغیرها در محدوده‌ی TDZ هستن و هوست نمیشن، قابل تغییر نیستن پس از
تعریف.

⭕️ استفاده از let و const به دلیل رفتارهای مدرن‌تر و قابل پیش‌بینی‌ترشون نسبت به var توصیه میشه. ⭕️


#جاوااسکریپت #javascript

@ninja_learn_ir
7
سلام مجدد رفقا 👋

امروزم پست جدید تو اینستا گذاشتیم بیاید حمایت کنید لطفا 🙏

دمتون گرم 🌹
https://www.instagram.com/p/C9zyG7COigf/
4
Ninja Learn | نینجا لرن pinned «سلام مجدد رفقا 👋 امروزم پست جدید تو اینستا گذاشتیم بیاید حمایت کنید لطفا 🙏 دمتون گرم 🌹 https://www.instagram.com/p/C9zyG7COigf/»
🎥 رفقا دوره DRF ای که خواستید در حال ضبط هست و بزودی منتشر میشه و کلی چیز جدید و پیشرفته قراره بگیرید 👌

دومین دوره ای که بیشترین رای رو آورده دوره امنیت توی برنامه نویسی وبه به نظرتون دوره بعدی دوره امنیت توی برنامه نویسی وب باشه؟ 🤔
Final Results
62%
بله، دوره امنیت باشه
38%
خیر، یه دوره دیگه باشه
👍4
سلام رفقا 👋

صبحتون بخیر

بازم مثل هر روز پست جدید داریم تو اینستا راجب پایتون 🐍

ممنون میشم بیاید حمایت کنید

واقعا بهمون انرژی میده آموزش های بیشتری بذاریم 🌹

https://www.instagram.com/p/C91mSFVuGKv/?igsh=OGJjN3I2dW56bmI1
5
#پست_جدید

💎 فیکسچر (fixure) در جنگو 💎

فیکسچر چیه؟
فیکسچر یه جور داده‌ی از پیش تعریف شده‌س که قبل از اجرای تست‌هامون به دیتابیس اضافه میشه. این داده‌ها میتونن هر چیزی باشن؛ از یه کاربر ساده گرفته تا یه محصول پیچیده توی فروشگاه آنلاینمون.

چرا بهش نیاز داریم؟

1️⃣ تست‌های دقیق‌تر: با داشتن داده‌های مشخص، می‌تونیم تست‌های دقیق‌تری بنویسیم و مطمئن بشیم که همه چیز طبق انتظار کار می‌کنه.

2️⃣ تست‌های سریع‌تر: به جای اینکه هر بار قبل از اجرای تست‌ها، داده‌های مورد نیازمون رو به صورت دستی وارد دیتابیس کنیم، با استفاده از فیکسچر این کار رو یک بار انجام میدیم و در تست‌های بعدی از همون داده‌ها استفاده می‌کنیم.

3️⃣ تکرارپذیری تست‌ها: با استفاده از فیکسچر، می‌تونیم مطمئن باشیم که هر بار که تست‌هامون رو اجرا می‌کنیم، نتیجه یکسانی خواهیم داشت.

ساختن یه فیکسچر
برای ساختن یه فیکسچر، یه فایل با پسوند json یا yaml ایجاد می‌کنیم و داده‌های مورد نظرمون رو به صورت ساخت‌یافته در اون تعریف می‌کنیم.

مثال با فرمت JSON:

[
{
"model": "myapp.Product",
"pk": 1,
"fields": {
"name": "گوشی موبایل سامسونگ",
"price": 5000000
}
},
{
"model": "myapp.Category",
"pk": 1,
"fields": {
"name": "گوشی موبایل"
}
}
]


در این مثال، ما دو رکورد برای مدل‌های Product و Category تعریف کردیم.

استفاده از فیکسچر در تست‌ها

from django.test import TestCase
from .models import Product

class ProductTestCase(TestCase):
fixtures = ['products.json']

def test_product_detail(self):
product = Product.objects.get(pk=1)
self.assertEqual(product.name, 'گوشی موبایل سامسونگ')

در این مثال، ما به کلاس تست‌مون گفتیم که قبل از اجرای هر تستی، فیکسچر products.json رو لود کنه. بعد، در تست test_product_detail، محصول با id برابر با ۱ رو پیدا می‌کنیم و مطمئن می‌شیم که نام محصول درسته.


دستورات لازم و ساخت و لود کردن فیکسچر

1️⃣ ساختن یه فیکسچر با دستور dumpdata
دستور dumpdata بهت اجازه میده که داده‌های موجود در دیتابیس رو به صورت یک فایل JSON یا YAML خروجی بگیری. این فایل خروجی رو میتونی به عنوان فیکسچر استفاده کنی.

# برای خروجی گرفتن از همه مدل‌ها به صورت JSON:Bash
python manage.py dumpdata app_name.ModelName --format json --indent 2 --output my_fixture.json

# برای خروجی گرفتن از یک مدل خاص به صورت YAML:
python manage.py dumpdata app_name.ModelName --format yaml--indent 2 --output my_fixture.yaml


2️⃣ استفاده از فیکسچر با دستور loaddata
دستور loaddata بهت اجازه میده که داده‌های موجود در یک فایل فیکسچر رو به دیتابیس اضافه کنی.

# برای بارگذاری داده‌های یک فایل JSON:
python manage.py loaddata my_fixture.json

# برای بارگذاری داده‌های یک فایل YAML:
python manage.py loaddata products.yaml


مثال عملی
فرض کن یه وبسایت فروشگاهی داریم و میخوایم یه تست بنویسیم که بررسی کنه آیا محصولی با نام خاص در دیتابیس وجود داره یا نه. اول از همه، با استفاده از دستور dumpdata از مدل Product یه فیکسچر میگیریم:

python manage.py dumpdata app_name.Product --format json --indent 2 --output product.json

سپس، در تستمون، این فیکسچر رو لود می‌کنیم و محصول مورد نظر رو جستجو می‌کنیم:

from django.test import TestCase
from .models import Product

class ProductTestCase(TestCase):
fixtures = ['products.json']

def test_product_exists(self):
product = Product.objects.get(name='گوشی موبایل سامسونگ')
self.assertIsNotNone(product)


⭕️ نکات کلیدی فیکسچر به زبان ساده
ساختار فیکسچر: فیکسچرت باید شبیه به همون چیزی باشه که توی دیتابیس داری. مثلاً اگه یه مدل محصول داری، فیکسچرت هم باید یه محصول رو تعریف کنه.
اسم‌گذاری فیکسچر: به فیکسچرت یه اسم بامعنا بده تا بفهمی توش چه داده‌هایی داری. مثلاً products.json یعنی توش اطلاعات محصول‌ها هست.
مدیریت فیکسچر: وقتی تست‌های زیادی می‌نویسی، باید یه جوری فیکسچرهات رو مرتب کنی تا گم نشی. می‌تونی از فولدرهای مختلف یا ابزارهای مخصوص استفاده کنی.


جمع‌بندی
فیکسچر یه ابزار خیلی خفنه که بهت کمک می‌کنه تست‌های بهتری بنویسی. با فیکسچر، می‌تونی داده‌های از پیش تعریف شده‌ای رو به دیتابیس اضافه کنی و تست کنی که همه چیز درست کار می‌کنه. انگار داری یه محیط آزمایشی برای برنامه‌ت می‌سازی.


⭕️ توجه: برای اطلاعات بیشتر و مثال های عملی تر، میتونید به مستندات رسمی جنگو مراجعه کنین.

#جنگو #تست #فیکسچر #برنامه_نویسی
👍42
Ninja Learn | نینجا لرن
🎥 رفقا دوره DRF ای که خواستید در حال ضبط هست و بزودی منتشر میشه و کلی چیز جدید و پیشرفته قراره بگیرید 👌

دومین دوره ای که بیشترین رای رو آورده دوره امنیت توی برنامه نویسی وبه به نظرتون دوره بعدی دوره امنیت توی برنامه نویسی وب باشه؟ 🤔
خب رفقا ۶۲ درصد به دوره امنیت رای دادید 😃

دوره بعد از DRF، امنیت توی برنامه نویسی وب هست 🤘

یه چیزایی از امنیت توی برنامه نویسی وب یادتون میدم که توی دوره های پولی هم کسی یاد نمیده 😉

منتظرش باشید 🔥
🔥7
رفقا، بنظرتون بعضی اوقات کوئیز بذاریم واستون دانش و تخصص خودتون رو بسنجید؟
Anonymous Poll
87%
آره، بذار
13%
نه، حسش نیست
1
سلام رفقا 👋

امیدوارم حال دلتون عالی باشه 😄

امروز یه پست خیلی مهم راجب جنگو داریم

مشکلی که خیلیا دارن و کسی توی دوره های آموزشی یادش نمیده یا کمتر کسی یاد میده

منتظرش باشید راس ساعت ۶ منتشر میشه 🤟

ارادتمند شما 🌹
👍4
🟡 کوئیز جاوااسکریپت

خروجی این کد چیه؟ (5 * "-")console.log
Anonymous Quiz
9%
Error
61%
پنج تا خط تیره (-----)
24%
NaN
6%
هیچکدوم
1
#پست_جدید

💎 مشکل N+1 توی جنگو 💎

امروز می‌خوایم در مورد یکی از مشکلاتی که ممکنه توی پروژه‌های جنگو باهاش برخورد کنیم صحبت کنیم. این مشکل اسمش N+1 هست و اگه بدونیم چیه و چطوری حلش کنیم، می‌تونیم برنامه‌های بهینه‌تر و سریع‌تری بنویسیم.


مشکل N+1 چیه؟

فرض کنید یک وبسایت فروشگاهی داریم که توش محصولات و دسته‌ بندی های محصولات داریم. هر محصول به یک دسته تعلق داره و هر دسته می‌تونه چندین محصول داشته باشه.

class Category(models.Model):
    name = models.CharField(max_length=100)

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)


اگه بخوایم لیستی از محصولات به همراه اسم دسته بندی شون نمایش بدیم، بدون استفاده از متد select_related برای هر محصول یک کوئری جداگونه برای دریافت اطلاعات دسته بندی اجرا میشه. این یعنی اگه 10 محصول داشته باشیم، 11 کوئری به دیتابیس ارسال می‌شه که این خیلی بده مخصوصا اگه تعداد محصولات توی دیتابیس خیلی زیاد باشه.


چطوری از این مشکل جلوگیری کنیم؟


1️⃣ متد select_related:

جنگو ابزارهای خوبی برای حل این مشکل در اختیارمون قرار داده. یکی از این ابزارها، متد select_related هست. با استفاده از این متد می‌تونیم همه اطلاعات مرتبط با یک آبجکت رو در یک کوئری از دیتابیس بخونیم. به این ترتیب، تعداد دفعات مراجعه به دیتابیس به شدت کاهش پیدا می‌کنه و برنامه‌مون خیلی سریع‌تر اجرا میشه.


مزایای استفاده از متد select_related؟

1- سرعت بیشتر: چون تعداد دفعات مراجعه به دیتابیس رو کم می‌کنه.
2- کاهش بار سرور: با کاهش تعداد کوئری‌ها، فشار روی سرور کمتر میشه.
3- کد تمیزتر: کدت منظم‌تر و قابل فهم‌تر میشه.


2️⃣ ابزار django-debug-toolbar:

جنگو یک ابزار دیباگ خیلی خوب داره به اسم django-debug-toolbar که بهتون کمک می‌کنه تا بتونین مشکلات پرفورمنسی برنامه‌تون رو شناسایی کنین. این ابزار بهتون نشون می‌ده که کدتون چند بار به دیتابیس مراجعه کرده و کجا مشکل N+1 وجود داره. با استفاده از این ابزار می‌تونین به راحتی مشکل N+1 رو پیدا کنین و برطرفش کنین.

⭕️ برای نصب این پکیج به این آدرس برید:
https://django-debug-toolbar.readthedocs.io/en/latest/installation.html


جمع‌بندی:

مشکل N+1 یکی از مشکلاتی هست که ممکنه در پروژه‌های جنگو باهاش برخورد کنین. این مشکل باعث میشه که برنامه‌تون کند بشه و پرفورمنسش کاهش پیدا کنه. با استفاده از متد select_related و ابزار django-debug-toolbar می‌تونین به راحتی این مشکل رو حل کنین و برنامه‌های بهینه‌تر و سریع‌تری بنویسین.

امیدوارم این پست برای شما مفید بوده باشه. اگه سوالی داشتین، حتما بپرسین.

#جنگو #برنامه_نویسی #مشکل_N_plus_one #بهینه‌سازی #django_debug_toolbar
👍10
#کوئیز_جاوااسکریپت

کدام یک از روش‌های زیر برای اضافه کردن یک عنصر جدید به انتهای یک آرایه در جاوا اسکریپت صحیح است؟🤔
Anonymous Quiz
17%
array.add(element)
38%
array.push(element)
42%
array.append(element)
4%
array.insert(element)
👍4
#پست_جدید

💎 تست نویسی با pytest درجنگو 💎

امروز میخوایم با یکی از ابزارهای قدرتمند برای تست کردن اپلیکیشن‌های جنگویی آشنا بشیم به اسم Pytest 😁

چرا pytest؟
چون که خیلی ساده و روان هست، کلی قابلیت کاربردی داره و جامعه کاربری بزرگی پشتشه. با pytest میتونیم با خیال راحت کدهامون رو بنویسیم و مطمئن باشیم که همه چیز سر جای خودش کار میکنه.

1️⃣ اولین قدم: نصب pytest
برای نصب pytest کافیه توی ترمینال پروژه جنگوییتون این دستور رو بزنید:

pip install pytest

2️⃣ دومین قدم: پیکربندی Pytest

پیکربندی یعنی اینکه به Pytest بگیم چطوری تست‌هامون رو اجرا کنه. مثلاً بگیم تست‌هامون کجا هستن، چه جوری گزارش بدیم و از چه ابزارهای اضافه‌ای استفاده کنیم.

فایل پیکربندی: pytest.ini
برای پیکربندی Pytest، از فایلی به اسم pytest.ini استفاده می‌کنیم. این فایل رو تو ریشه پروژه یا توی پوشه‌ای که تست‌هامون توش هست می‌ذاریم.

پیکربندی برای پروژه های جنگو:👇

[pytest]
addopts = --verbose
testpaths = tests
DJANGO_SETTINGS_MODULE = 'myproject.settings.test'


حالا بریم چندتا مثال ببینیم😁


مثال های ساده:

1️⃣ تست مدل‌ها (models)
فرض کنین یه مدل User داریم:

from django.db import models

class User(models.Model):
username = models.CharField(max_length=100)
email = models.EmailField()

برای تست این مدل میتونیم یه تست بنویسیم که بررسی کنه آیا فیلدهای username و email اجباری هستن یا نه:

import pytest
from .models import User

def test_user_creation():
with pytest.raises(ValueError):
user = User.objects.create()

این تست سعی میکنه یه کاربر بدون مقداردهی کردن فیلدهای username و email ایجاد کنه. چون این فیلدها اجباری هستن، باید یه خطا از نوع ValueError بگیره.

2️⃣ تست ویوها (views)
حالا بیاین یه ویو ساده رو تست کنیم که یه لیست از
def user_list(request):
users = User.objects.all()
return render(request, 'users.html', {'users': users})

برای تست این ویو، میتونیم از یه کلاینت تست استفاده کنیم تا درخواست GET به این ویو بفرسته و نتیجه رو بررسی کنیم:
from django.test import Client

def test_user_list_view():
client = Client()
response = client.get('/users/')
assert response.status_code == 200

این تست یه درخواست GET به آدرس '/users/' میفرسته و بررسی میکنه که آیا پاسخ با کد وضعیت 200 (OK) برگشته یا نه.

3️⃣ تست URL ها
برای تست URL ها هم میتونیم از تابع resolve استفاده کنیم:

from django.urls import resolve

def test_user_list_url():
url = resolve('/users/')
assert url.func == user_list

این تست بررسی میکنه که آیا URL '/users/' به ویوی user_list اشاره میکنه یا نه.

جمع‌بندی
در این پست، به صورت خیلی خلاصه با تست نویسی در جنگو با استفاده از pytest آشنا شدیم. pytest ابزاری قدرتمند و کاربرپسنده برای نوشتن تست‌های مختلف در پروژه‌های جنگویی هست. با نوشتن تست، میتونیم اطمینان حاصل کنیم که اپلیکیشن ما به درستی کار میکنه و تغییرات جدید باعث ایجاد مشکل نمیشه.

⭕️ نکته: این فقط یه مقدمه بود! pytest قابلیت‌های خیلی بیشتری داره که میتونیم ازشون استفاده کنیم. مثلاً میتونیم تست‌های پارامتریزه شده، تست‌های پیچیده تر و تست‌های مربوط به قالب‌ها (templates) بنویسیم.
میتونید برای مطالعه بیشتر به داکیومنت pytest سر بزنید

#جنگو #پایتون #pytest
8
💎 ساختن چندتا ابجکت بصورت همزمان (bulk_create) در جنگو 💎

امروز میخوایم در مورد یکی از قابلیت‌های خیلی کاربردی جنگو به اسم Bulk Create صحبت کنیم. این قابلیت وقتی به دردتون میخوره که بخواید چندتا داده رو یکجا به دیتابیس اضافه کنید. مثلا فرض کنید میخواید اطلاعات ۱۰ تا محصول جدید رو تو فروشگاه آنلاینتون ثبت کنید. اگه بخواید هر کدوم رو تک تک سیو کنید که کلی وقتتون رو میگیره و اصلا به صرفه و بهینه نیست.

حالا ببینم Bulk Create چطوری کار میکنه؟🤔

به جای اینکه برای هر داده یه دستور سیو جداگانه بنویسیم، با Bulk Create میتونیم همه داده ها رو یکجا داخل یه لیست بریزیم و با یه دستور ساده همه رو با هم سیو کنیم. اینجوری سرعت کارمون خیلی بیشتر میشه و منابع سرور هم کمتر مصرف میشه.

1️⃣ مثال اول: اضافه کردن چندتا محصول جدید

فرض کنید مدل محصول ما این شکلیه:

class Product(models.Model):
name = models.CharField(max_length=100)
price = models.FloatField()
description = models.TextField()


حالا میخوایم چندتا محصول جدید به این شکل اضافه کنیم: 👇


products = [
Product(name='گوشی آیفون 14', price=15000000, description='بهترین گوشی سال'),
Product(name='لپتاپ دل XPS 13', price=25000000, description='لپتاپ فوق سبک و قدرتمند'),
# ... و بقیه محصولات
]

Product.objects.bulk_create(products)

با این کد، همه محصولات داخل لیست products یکجا به دیتابیس اضافه میشن.

2️⃣ مثال دوم: اضافه کردن چندتا کامنت به یک پست


class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
text = models.TextField()

comments = [
Comment(post=post, text='کامنت اول'),
Comment(post=post, text='کامنت دوم'),
# ... و بقیه کامنت‌ها
]

Comment.objects.bulk_create(comments)


اینجا هم به همین صورت، همه کامنت‌ها به یکجا به پست موردنظر اضافه میشن.

نکات مهم:

توجه: Bulk Create فقط برای ایجاد اشیاء جدید استفاده میشه. برای آپدیت کردن اشیاء موجود باید از روش‌های دیگه استفاده کنید.

بهینه سازی ⏱️: برای بهبود عملکرد، سعی کنید تعداد اشیایی که در هر بار Bulk Create ایجاد میکنید رو بهینه کنید. خیلی زیاد یا خیلی کم بودن تعداد اشیاء میتونه روی عملکرد سیستم تاثیر بگذاره.

خطاها : اگر در حین اجرای Bulk Create خطایی رخ بده، هیچکدوم از اشیاء ایجاد نمیشن. پس حتما قبل از اجرا، داده‌ها رو به خوبی اعتبارسنجی کنید.

جمع‌بندی

و در اخر Bulk Create یکی از ابزارهای قدرتمند جنگو است که به شما کمک میکنه تا عملیات ایجاد داده رو بهینه کنید. با استفاده از این قابلیت، میتونید به راحتی هزاران رکورد رو در کوتاه‌ترین زمان ممکن به دیتابیس اضافه کنید. ⏱️

اگه دوست دارید درموردش بیشتر بدونید میتونید یه سر به داکیومنت خود جنگو بزنید 😁

امیدوارم این آموزش براتون مفید بوده باشه :)

#جنگو #BulkCreate #برنامه_نویسی #پایتون #توسعه_وب #django #python #webdevelopment
👍122
بچه ها توی پیج کوسشن باکس گذاشتیم✌️

هرسوالی که دارید رو میتونید اونجا بپرسید جواب میدیم 😉

لینک کوسشن باکس👇
https://www.instagram.com/stories/ninjalearn.ir/3422061628463170151?igsh=MWF3ODl6aGw0ajhlZg==
👍3