Skip to content
میلاد حاتمی
میلاد حاتمی هستم. برنامه نویس و مدرس جنگو. امیدوارم بتونم با آموزش های رایگان در جنگولرن به برنامه نویس های این فریمورک کمک کنم.

حمایت از جنگولرن

تمامی مطالب و آموزش های جنگولرن رایگان است. برای حمایت از جنگولرن اینجا (پلتفرم کافیته) کلیک کنید.

09384677005 miladhzz@gmail.com instagram linkedin github-circle
جنگولرن - آموزش رایگان Django به زبان فارسی
خانه » چرا در جنگو بهتر است از save به تنهایی استفاده نکنیم؟
Post Views: 309

چرا در جنگو بهتر است از save به تنهایی استفاده نکنیم؟

اکتبر 18, 2024 اکتبر 18, 2024 دسته‌بندی نشده
میلاد حاتمی

تو جنگو هیچوقت از .save() خالی استفاده نکنید موقعه آپدیت کردن. چون هرچی تو مموری باشه فلاش میکنه به دیتابیس. پس بهتره explicit باشین و بگین چی میخواین فرستاده شه سمت دیتابیس. یک مثال عینی میزنم که متوجه شین یعنی چی این جمله.

ببین فکر کن یک مدل داری با ۳ تا فیلد

MyModel
– id
– first_name
– last_name

که دو تای پایینی nullable هستن. رکورد ایدی اول تو دیتابیس هم first name اش null هست هم last name اش. من ۲ درخواست همزمان میدم. درخواست اول first name رو مانی میکنم. درخواست دوم last name رو مظفر.
اتفاقی که میفته اینه که اول از دیتابیس MyModel رو میخونه جفت درخواستا. برای جفتشون first_name=None و last_name=None هست. بعد هرکدومشون همچین query ای میزنن:

درخواست اول:

// model.first_name = “Mani”
// model.save()
UPDATE MyModel
SET first_name = ‘Mani’, last_name = NULL
WHERE MyModel.id = 1

درخواست دوم:

// model.last_name = “Mozaffar”
// model.save()
UPDATE MyModel
SET first_name = NULL, last_name = ‘Mozaffar’
WHERE MyModel.id = 1

دیدی چی شد؟ جفتشون یک NULL هم فرستادن سمت دیتابیس. چرا؟ چون تو مموری یکی از نام و نام خانوادگی null بود و وقتی .save رو میزنی همونو میفرسته به دیتابیس.
بنابراین یا first name نال میمونه یا last name. در صورتی که درستش اینه:

// req 2
UPDATE MyModel
SET last_name = ‘Mozaffar’
WHERE MyModel.id = 1

// req 1
UPDATE MyModel
SET first_name = ‘Mani’
WHERE MyModel.id = 1

معادل orm اش چی میشه؟

# req 1
MyModel.object.filter(id=instance.id).update(last_name=”Mani”)

# req 2
MyModel.object.filter(id=instance.id).update(last_name=”Mozaffar”)

# OR…
mymodel.save(update_fields=[‘first_name’])

@PyBackendHub

Post Views: 309
1
کپی از مطالب حتی بدون ذکر منبع مجاز است.