تو جنگو هیچوقت از .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