Syntax | سینتکس
Open in Telegram
Focus: Web Lan: Python & Go Website: https://syntaxfa.ir Quick connect: https://quick-connect.syntaxfa.ir Github: https://github.com/syntaxfa Group: https://t.me/Syntax_fa_group
Show more3 189
Subscribers
No data24 hours
-27 days
+1230 days
Posts Archive
\nمثالهای htmx\nدر زیر چند مثال از کاربرد htmx آورده شده است:\n\nAJAX\n\n\nاین دکمه با استفاده از ویژگیهای hx-post و hx-swap، به htmx میگوید که با کلیک کردن روی دکمه، یک درخواست AJAX به آدرس /clicked ارسال کند و محتوای دکمه را با پاسخ HTML جایگزین کند¹.\n\nمثال 2:\nبارگزاری lazy\n\n








\n More content...\n
\nاین مثال نشان میدهد که چگونه میتوان محتوایی را با استفاده از hx-get و hx-trigger به صورت lazy بارگذاری کرد، به طوری که هنگامی که کاربر به انتهای صفحه میرسد، محتوای جدید بارگذاری میشود.\n\nبرای مثالهای بیشتر و جزئیات کاملتر، میتوانید به مستندات htmx مراجعه کنید.\n\nDocumentation:\nhttps://htmx.org/docs\n\nExamples:\nhttps://htmx.org/examples/\n\n(6) آشنایی با HTMX – دیگر به جاوا اسکریپت نیازی ندارید! - راکت.\nhttps://roocket.ir/articles/htmx\n\n#htmx\n\n@Syntax_fa","datePublished":"2024-04-07T23:00:25Z","dateModified":"2024-04-07T23:00:25Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":575},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":8}]}},{"@type":"ListItem","position":9,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2397","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2397","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2397","headline":"لوگو جدیدمونو طراح گرافیک تیممون زده. اگه پروژه ای دارید می تونه براتون انجام بده و کارشم عالیه آیدی جهت ارتب…","articleBody":"لوگو جدیدمونو طراح گرافیک تیممون زده.\n\nاگه پروژه ای دارید می تونه براتون انجام بده و کارشم عالیه\n\nآیدی جهت ارتباط:\nhttps://t.me/enznin","datePublished":"2024-04-07T20:17:54Z","dateModified":"2024-04-07T20:17:54Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":11,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":574},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":12},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":11}]}},{"@type":"ListItem","position":10,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2393","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2393","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2393","headline":"Syntax | سینتکس","datePublished":"2024-04-07T19:43:33Z","dateModified":"2024-04-07T19:43:33Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":6,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":631},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6}]}},{"@type":"ListItem","position":11,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2391","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2391","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2391","headline":"Syntax | سینتکس","datePublished":"2024-04-07T19:43:01Z","dateModified":"2024-04-07T19:43:01Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":24,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":630},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":2},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":24}]}},{"@type":"ListItem","position":12,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2389","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2389","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2389","headline":"وقتی تو گروه برنامه نویسا از اینجور بازیا میفرستی #fun @Syntax_fa","articleBody":"وقتی تو گروه برنامه نویسا از اینجور بازیا میفرستی\n\n#fun\n\n@Syntax_fa","datePublished":"2024-04-07T16:40:31Z","dateModified":"2024-04-07T16:40:31Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":2,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":669},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":27},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":6},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2}]}},{"@type":"ListItem","position":13,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2388","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2388","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2388","headline":"آموزش دیزاین پترن prototype در پایتون [Hossein ramezan pour] #design_pattern #prototype @Syntax_fa","articleBody":"آموزش دیزاین پترن prototype در پایتون\n\n[Hossein ramezan pour]\n\n#design_pattern #prototype\n\n@Syntax_fa","datePublished":"2024-04-07T14:50:56Z","dateModified":"2024-04-07T14:50:56Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":2,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":586},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":23},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2}]}},{"@type":"ListItem","position":14,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2387","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2387","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2387","headline":"Syntax | سینتکس","datePublished":"2024-04-07T06:55:41Z","dateModified":"2024-04-07T06:55:41Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":2,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":623},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":10},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":46},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2}]}},{"@type":"ListItem","position":15,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2386","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2386","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2386","headline":"صحبت خودمونی درباره JWT و راهنمایی های خوب آقا سعید حتما گوش بدید کلی نکته هست","articleBody":"صحبت خودمونی درباره JWT و راهنمایی های خوب آقا سعید\n\nحتما گوش بدید کلی نکته هست","datePublished":"2024-04-05T19:28:25Z","dateModified":"2024-04-05T19:28:25Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":610},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":9}]}},{"@type":"ListItem","position":16,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2385","url":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2385","mainEntityOfPage":"https://telemetr.io/en/channels/1469032224-syntax_fa/posts/2385","headline":"Syntax | سینتکس","datePublished":"2024-04-05T19:27:26Z","dateModified":"2024-04-05T19:27:26Z","author":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"publisher":{"@type":"Organization","name":"Syntax | سینتکس","url":"https://telemetr.io/en/channels/1469032224-syntax_fa","image":"https://img.tlmtr.io/c/1BpUo8/5983433714924898935?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":620},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":5},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":13}],"sharedContent":{"@type":"SocialMediaPosting","headline":"Mr.Grayhat [S.R]","datePublished":"2024-04-05T19:17:32Z"}}}]}3 189
قبل مصاحبه یکاری هست که بنظرم حتما انجامش بدید!
برید صفحه لینکدینشون رو پیدا کنید. بعد میتونید افرادی که توی اون شرکت کار میکنن رو ببینید.
از بین افرادی که اونجا کار میکنن به کسایی که پوزیشن شغلیشون مرتبط با شما هستش، درخواست کانکشن بدید و بهشون پیام بدید و بگید با شرکت شما مصاحبه دارم ... و راهنمایی میخوام.
اکثرا با خوشرویی بهتون جواب میدن و شمارو راهنمایی می کنن. همچنین اینکه پیگیر شرکت بودید یک پوینت مثبت به حساب میاد.
#interview
@Syntax_fa
3 189
چرا باید از F expression توی django orm استفاده کنیم؟
در Django ORM، F expressions یا عبارات F، یک راه قدرتمند برای انجام عملیات روی فیلدهای مدل در سطح پایگاه داده هستند. با استفاده از عبارات F، میتوانید مقادیر فیلدها را در پایگاه داده بدون بازیابی و بروزرسانی در سطح کد Python تغییر دهید. این امر میتواند منجر به افزایش کارایی و جلوگیری از رخ دادن مشکلات race condition شود.
مثال کاربردی:
فرض کنید یک برنامه فروشگاه آنلاین دارید و میخواهید در هنگام خرید، تعداد موجودی کالا را کاهش دهید. میتوانید این کار را با استفاده از عبارات F در Django ORM به شکل زیر انجام دهید:
from django.db.models import F
# مدل Product
class Product(models.Model):
name = models.CharField(max_length=100)
stock = models.PositiveIntegerField()
# مثال خرید یک محصول
product = Product.objects.get(name='iPhone')
product.stock = F('stock') - 1
product.save()
در این مثال، ما از F('stock') استفاده میکنیم تا به Django بگوییم که مقدار فعلی فیلد stock را از پایگاه داده بخواند. سپس، عملگر - را به این مقدار اعمال میکنیم تا یک واحد از آن کم شود. در نهایت، با استفاده از `product.save()`، مقدار جدید را در پایگاه داده ذخیره میکنیم.
مزیت استفاده از عبارات F در این مثال این است که عملیات کاهش موجودی در سطح پایگاه داده انجام میشود، نه در سطح کد Python. این امر از بروز مشکلات race condition جلوگیری میکند، زیرا اگر چندین کاربر همزمان سعی در خرید یک محصول داشته باشند، عملیات کاهش موجودی به درستی انجام خواهد شد.
عبارات F همچنین میتوانند برای انجام عملیات پیچیدهتر روی فیلدهای مدل استفاده شوند. به عنوان مثال، میتوانید از آنها برای محاسبه درصد تخفیف و کاهش قیمت یک محصول استفاده کنید:
from django.db.models import F
product.price = F('price') * (1 - F('discount_percent') / 100)
product.save()
در این مثال، ما از عبارات F برای محاسبه قیمت جدید محصول با توجه به درصد تخفیف آن استفاده میکنیم.
عبارات F همچنین با عملگرهای انضمامی (annotated aggregates) و عملگرهای مقایسهای قابل استفاده هستند، که میتواند آنها را به ابزاری قدرتمند برای پردازش دادهها در سطح پایگاه داده تبدیل کند.
در کل، عبارات F در Django ORM یک ابزار قدرتمند برای انجام عملیات روی فیلدهای مدل در سطح پایگاه داده هستند و میتوانند به افزایش کارایی و جلوگیری از مشکلات رایج مانند race condition کمک کنند.
#django #orm
@Syntax_fa3 189
متد iterator در django orm
در Django ORM، متد
iterator() یک ابزار کارآمد برای پردازش مجموعههای داده بزرگ است. این متد یک ایتراتور (iterator) را برمیگرداند که میتوانید آن را برای دسترسی تدریجی به رکوردهای جدول استفاده کنید. این روش در مقایسه با متدهای معمولی مانند all() یا values() که تمام رکوردها را یکباره در حافظه بارگذاری میکنند، کارآمدتر است.
مثال کاربردی:
فرض کنید میخواهید یک فایل CSV را از رکوردهای یک جدول در پایگاه داده پر کنید. اگر تعداد رکوردها بسیار زیاد باشد، بارگذاری همه آنها در حافظه ممکن است باعث مشکلات مربوط به مصرف حافظه شود. در چنین مواردی، میتوانید از iterator() استفاده کنید تا رکوردها را به صورت تدریجی پردازش کنید.
from django.core.files import File
from myapp.models import MyModel
# باز کردن فایل CSV برای نوشتن
csv_file = open('data.csv', 'w')
# نوشتن سرآیند (headers) در فایل CSV
csv_file.write('field1,field2,field3\n')
# استفاده از iterator() برای دسترسی تدریجی به رکوردها
for obj in MyModel.objects.iterator():
# نوشتن هر رکورد در فایل CSV
csv_file.write(f'{obj.field1},{obj.field2},{obj.field3}\n')
# بستن فایل CSV
csv_file.close()
در این مثال، ما از MyModel.objects.iterator() برای دریافت یک ایتراتور استفاده میکنیم. سپس با یک حلقه `for`، هر رکورد را به صورت تدریجی پردازش میکنیم و آن را در فایل CSV مینویسیم.
مزایای استفاده از iterator():
1. کارآمدی حافظه: رکوردها به صورت تدریجی در حافظه بارگذاری میشوند، بنابراین حافظه کمتری مصرف میشود.
2. پردازش تدریجی: میتوانید رکوردها را یکی یکی پردازش کنید، بدون نیاز به بارگذاری همه آنها در حافظه.
3. سرعت بالا: معمولاً سریعتر از بارگذاری همه رکوردها در حافظه و سپس پردازش آنهاست.
توجه داشته باشید که iterator() فقط یک بار قابل استفاده است و پس از پایان حلقه، دیگر قابل استفاده نیست. همچنین، شما نمیتوانید از فیلترها یا سورتکردن رکوردها با iterator() استفاده کنید. برای این کارها، باید ابتدا یک QuerySet معمولی ایجاد کنید و سپس از iterator() روی آن استفاده کنید.
وقتی از iterator استفاده می کنیم، سمت دیتابیس چه اتفاقی می افتد؟
زمانی که از iterator() در Django ORM استفاده میکنید، Django در سمت پایگاه داده یک "Server-side Cursor" را ایجاد میکند. این کارسر (Cursor) در واقع یک ابزار در سمت سرور پایگاه داده است که به شما امکان میدهد رکوردها را یکی یکی و به صورت تدریجی از پایگاه داده بخوانید، بدون اینکه نیاز باشد همه رکوردها را یکباره در حافظه بارگذاری کنید.
فرآیند کار با Server-side Cursor به این شرح است:
1. ایجاد کارسر: زمانی که از iterator() استفاده میکنید، Django یک درخواست SQL برای ایجاد یک کارسر در سمت سرور پایگاه داده ارسال میکند.
2. اجرای درخواست: سرور پایگاه داده درخواست SQL را اجرا میکند و یک کارسر ایجاد میکند که به صورت تدریجی میتواند رکوردها را بازیابی کند.
3. بازیابی تدریجی رکوردها: در هر بار که در حلقه for به رکورد بعدی میرسید، Django از طریق کارسر ایجاد شده، درخواست بازیابی رکورد بعدی را به سرور پایگاه داده ارسال میکند.
4. دریافت رکورد: سرور پایگاه داده رکورد بعدی را از طریق کارسر بازیابی میکند و آن را به Django برمیگرداند.
5. تکرار گام 3 و 4: این فرآیند تا زمانی که همه رکوردها بازیابی شوند یا حلقه for متوقف شود، ادامه مییابد.
6. بستن کارسر: پس از اتمام حلقه، Django درخواست بستن کارسر را به سرور پایگاه داده ارسال میکند.
استفاده از Server-side Cursor به این معنی است که رکوردها به صورت تدریجی از پایگاه داده بازیابی میشوند، بدون اینکه نیاز باشد همه آنها یکباره در حافظه لود شوند. این امر باعث صرفهجویی در مصرف حافظه و افزایش کارایی میشود، به ویژه زمانی که با مجموعههای داده بزرگ سروکار دارید.
#django #cursor
@Syntax_fa3 189
چند نکته طلایی موقعی که داری از django orm استفاده می کنی.
(قسمت دوم)
6. افزایش پرفورمنس با استفاده از کش کردن.
کش کردن باعث میشه تعداد کوئری هایی که سمت دیتابیس میزنیم کاهش پیدا کنه. همچنین ریسپانس تایم دریافت اطلاعات خیلی کمتر بشه.
براش کش کردن می تونید از کش فریم ورک built-in جنگو استفاده کنید.
from django.core.cache import cache
# Retrieve posts from cache, if available
cached_posts = cache.get('all_posts')
if cached_posts is None:
cached_posts = list(Post.objects.all())
cache.set('all_posts', cached_posts)
7. وقتی صحبت از آپدیت کردن و دیلیت کردن چندین row می شود. جنگو دو متد به اسم delete و update در اختیار ما قرار داده است تا با پرفورمنس بهتر و سربار کمتر عملیات آپدیت و دیلیت کردن رو انجام بدیم.
# Updating multiple posts' status in a single query
Blog.objects.filter(category='draft').update(status='published')
8. بررسی و آنالیز کردن:
برای بررسی و دیباگ کردن، ابزار های زیادی در جنگو وجود دارد. مانند django debug toolbar. آنالیز کردن کوئری ها باعث میشه متوجه باتل نک ها شویم و بتونیم پرفومنس کوئری هارو افزایش بدیم.
link
#django #orm
@Syntax_fa3 189
چند نکته مهم طلایی موقعی که دارید از django orm استفاده می کنید.
(قسمت اول)
1. کوئری ست هارو کاربردی بزنید:
از filters و annotations و aggregation استفاده کنید تا فیلد هایی که نیاز دراید رو با کمترین سربار دریافت کنید.
همچنین از متد defer و only برای محدود کردن فیلد هایی که قراره از دیتابیس بگیرید استفاده کنید تا optimize تر بشه کوئری شما و همچنین مصرف مموری نیز کمتر بشه.
# Fetches specific fields to avoid unneccessory fields fetch and store into the memory
blogs = Blog.objects.only('title', 'is_active').filter(category='tech')
2. ایندکس کردن:
استفاده کردن از ایندکس کلید افزایش کارامدی و سرعت کوئری های شما هستش.
هر فیلدی که قراره زیاد توی Where استفاده کنید رو پیشنهاد میشه ایندکس کنید.
# Adding an index to the "category" column for faster searches via category
class Blog(models.Model):
title = models.CharField(max_length=100)
category = models.CharField(max_length=50, db_index=True)
# ...
همچنین ممکنه ایندکس کردن مخرب هم باشه. به این لینک سر بزنید:
https://python.plainenglish.io/mastering-the-art-of-meeting-database-indexing-needs-8b891e74794b
3. کوئری ها بصورت defer اجرا میشن!!
جنگو orm از این روش استفاده می کند تا کوئری ها تنها زمانی اجرا بشن که شما بهشون نیاز دارید. یعنی وقتی شما مینویسید
users = User.objects.all()
این کوئری اجرا نمیشود، تا زمانی که شما از مقدار users استفاده کنید.
همچنین اگه شما حواستون نباشه ممکنه یک اشتباه خیلی بزرگ انجام بدید. به مثال زیر دقت کنید:
# Queries are executed when data is actually needed, minimizing unnecessary hits
blogs = Blog.objects.all()
for blog in blogs:
print(blog.author) # Each blog's author query is executed here
تو این مثال هربار که blog.author رو میزنیم، یک hint سمت دیتابیس زده میشه.
4. از select_related و prefetch_related استفاده کنید.
این دو متد میتونن وقتی که توی مدلتون related دارید، تعداد کوئری هایی که سمت دیتابیس زده میشن رو خیلی کاهش بدن.
از select_related زمانی استفاده میشه که شما یک تک رابطه دارید. و از prefetch_related زمانی استفاده میشه که شما چندین رابطه دارید. مثلا:
# Reduces database queries using select_related when accessing related objects
blogs = Blog.objects.select_related('author').all()
for blog in blogs:
print(blog.author)
# Retrieves related objects in separate queries using prefetch_related, improving performance
authors = Author.objects.prefetch_related('blogs').all()
for author in authors:
for blog in author.blogs.all():
print(post)
5. از n + 1 اجتناب کنید!
مشکل n + 1 زمانی اتفاق میوفته که شما میخواید مجموعه از آبجکت هارو بگیرید. مثلا فرض کنید مدل پست رو داریم. مدل پست n تا کامنت داره.
زمانی که شما میخواید تک تک کامنت هارو بگیرید و اطلاعاتش رو نشون بدید با n + 1 مواجه میشوید.
یک یعنی کوئری که برای گرفتن پست زده شده، و n تعداد کوئری هایی که برای گرفتن کامنت ها زده شده. از این قبیل مشکلات رو خیلی راحت میتونیم با select_related و prefetch_related برطرف کنیم و با یک کوئری اطلاعات تمامی کامنت هارو هم بگیریم(این رو هم در نظر بگیرید هر چقدر کامنت ها بیشتر باشه، کوئری که میزنیم سنگین تر میشه).
# Using prefetch_related to fetch related comments efficiently
blogs = Blog.objects.prefetch_related('comments').all()
for blog in blogs:
for comment in blog.comments.all():
print(comment)
#django #orm
@Syntax_fa3 189
در اکثر پروژه های نرم افزاری این که یک مشکلی چطور حل میشه اصلا برای کارفرما مهم نیست، اونا به دنبال نتیجه و راهکار هستند. راهکاری که درد و مشکلشون رو رفع کنه.
اگر در ارتباط با کارفرما بیش از حد به مسائل فنی و جزئیات پیاده سازی بپردازید، اون رو می ترسونید و به شکایت کارفرما نزدیکتر خواهید شد.
✅ 10 توصیه مهم هم از من بشنوید برای اینکه ارتباط بهتری با کارفرما بگیرید و در نهایت حال خوب شما و اون بیشتر باشه:
1. اول از همه، وقت بذارید تا بفهمید کارفرما دقیقاً چی از شما میخواد. این یعنی سؤالات دقیق بپرسید و با تمام وجود گوش کنید، فعالانه گوش کنید!
2. به جای اینکه فقط یک طرفه صحبت کنید، سعی کنید یک گفتگوی دو طرفه شکل بدید. خیلی مهمه که کارفرما حس کنه نظرش براتون ارزشمنده. اینا نقش سوال پرسیدن های هدفمند خیلی کلیدی هست.
3. سعی کنید از اصطلاحات فنی زیاد استفاده نکنید. بیشتر سعی کنید با زبان ساده حرف بزنید تا همه بتوانند منظور شما را به راحتی درک کنند. من همیشه گفتم که هر چی فنی تر صحبت کنی کارفرما رو بیشتر می ترسونی!
4. روی این تمرکز کنید که چطور راهحلهاتون میتونند به کارفرما کمک کنند تا به اهدافش برسه. در نهایت باید درد اون برطرف شه.
5. به کارفرما گزینههای مختلفی ارائه بدید و برای هر کدوم مزایا و معایب رو شرح بدهید تا بتونه یک تصمیم آگاهانه بگیره. می خواید کاریزماتیک تر باشی، نظر قاطعانه خودتون در مورد گزینه ای که برای کارفرما بهتر هست رو هم مطرح کنید.
6. توی جلسات به موقع حاضر بشید، ارائههاتون رو منظم و حرفهای انجام بدهید و باز اینجا مراقب باشید فنی گویی بیش از حد نداشته باشید!
7. از کارفرما بخواید تا در طول فرایند، نظراتش رو با شما به اشتراک بذاره. این طوری اونها حس میکنن که واقعاً بهشون اهمیت میدید.
8. داستانهایی بگید که نشون میده راه حلهای شما چطور تونسته در گذشته مشکلات مشابهی رو حل کنه. داستان گویی در اینجا هوشمندانه ترین روش ایجاد اعتبار و دلگرم کردن کارفرما از کارا بودن راهکار شماست.
9. صبور باشید و برای پاسخگویی به سؤالات، همیشه آماده باشید.
10. و در آخر اینکه، نشون بدید که شما به دنبال یادگیری و بهبود مداوم هستید تا بتونید بهترین خدمات رو به کارفرما ارائه بدید.
link
#note
@Syntax_fa
3 189
توضیح درباره Htmx
htmx چیست؟
یک کتابخانه جاوا اسکریپت است که امکان دسترسی به ویژگیهای مدرن مرورگرها را مستقیماً از طریق HTML فراهم میکند. این کتابخانه با استفاده از ویژگیهایی مانند AJAX، CSS Transitions، WebSockets و Server Sent Events، توسعه رابط کاربری مدرن را با سادگی و قدرت هایپرتکست امکانپذیر میسازد.
نصب htmx
برای استفاده از htmx، میتوانید از CDN استفاده کنید یا فایل
htmx.min.js را به پروژه خود اضافه کنید.
به عنوان مثال:
<script src="https://unpkg.com/htmx.org@1.9.11"></script>
مثالهای htmx
در زیر چند مثال از کاربرد htmx آورده شده است:
AJAX
<!-- دکمهای که با کلیک کردن، یک درخواست AJAX ارسال میکند -->
<button hx-post="/clicked" hx-swap="outerHTML">کلیک کنید</button>
این دکمه با استفاده از ویژگیهای hx-post و hx-swap، به htmx میگوید که با کلیک کردن روی دکمه، یک درخواست AJAX به آدرس /clicked ارسال کند و محتوای دکمه را با پاسخ HTML جایگزین کند¹.
مثال 2:
بارگزاری lazy
<!-- محتوایی که به صورت lazy بارگذاری میشود -->
<div hx-get="/lazy-content" hx-trigger="revealed">
More content...
</div>
این مثال نشان میدهد که چگونه میتوان محتوایی را با استفاده از hx-get و hx-trigger به صورت lazy بارگذاری کرد، به طوری که هنگامی که کاربر به انتهای صفحه میرسد، محتوای جدید بارگذاری میشود.
برای مثالهای بیشتر و جزئیات کاملتر، میتوانید به مستندات htmx مراجعه کنید.
Documentation:
https://htmx.org/docs
Examples:
https://htmx.org/examples/
(6) آشنایی با HTMX – دیگر به جاوا اسکریپت نیازی ندارید! - راکت.
https://roocket.ir/articles/htmx
#htmx
@Syntax_fa3 189
لوگو جدیدمونو طراح گرافیک تیممون زده.
اگه پروژه ای دارید می تونه براتون انجام بده و کارشم عالیه
آیدی جهت ارتباط:
https://t.me/enznin
3 189
آموزش دیزاین پترن prototype در پایتون
[Hossein ramezan pour]
#design_pattern #prototype
@Syntax_fa
