Amer Abdallah نشر 2 سبتمبر 2021 أرسل تقرير نشر 2 سبتمبر 2021 أريد أن أعرف الفرق بين السطرين التاليين: example = ExampleModel() test = TestModel.objects.create() هل يقوم الثاني على الفور بإنشاء TestModel في قاعدة البيانات ، بينما بالنسبة لـ ExampleModel ، يجب استدعاء التابع save () بشكل صريح لإضافته إلى قاعدة البيانات؟ أم أن هناك إختلاف آخر؟ 1 اقتباس
1 سامح أشرف نشر 2 سبتمبر 2021 أرسل تقرير نشر 2 سبتمبر 2021 ما تعتقده صحيح، حيث في السطر الأول يجب أن تستدعي التابع save لكي يقوم بحفظ الكائن في قاعدة البيانات، وهذا الأمر يفيد إن كنت تريد التعديل على الكائن قبل حفظه، بينما في السطر الثاني يتم إنشاء الكائن بشكل مباشر في قاعدة البيانات في خطوة واحدة، مما يجعل من الكود أقصر وأكثر قابلية للقراءة. حسب توثيق Django: اقتباس save() takes a number of advanced options not described here. See the documentation for save() for complete details. To create and save an object in a single step, use the create() method. أي أن التابع save يسمح لك بعمل مجموعة من الخيارات المتقدمة، بينما create يسمح لك بحفظ الكائن في قاعدة البيانات في خطوة واحدة. من المميزات التي يسمح لك التابع save القيام بها هي عمل INSERT OR UPDATE للكائن في قاعدة البيانات وبالتالي في حالة وجود الكائن في قاعدة البيانات بالفعل سوف يتم تحديثه، بينما في حالة إستخدام create سوف يظهر خطأ كالتالي: # django.db.utils.IntegrityError: (1062, "Duplicate entry '13' for key 'PRIMARY'") ويمكنك أن تتحكم في هذه الميزة عبر المدخل force_insert والذي يقبل قيمة منطقية True/False. الأمر الأخير هو أن التابع save يقوم بإرجاع None، بينما create يقوم بإرجاع instance من هذا النموذج. 1 اقتباس
0 Ali Haidar Ahmad نشر 2 سبتمبر 2021 أرسل تقرير نشر 2 سبتمبر 2021 (معدل) هناك اختلافات بين هذين الأمرين: بالنسبة لعمليتي الinsert وال update فإن model.save يقوم إما بإدراج أو تحديث كائن في قاعدة بيانات: UPDATE إذا تم تعيين واصفة المفتاح الرئيسي pk للكائن على قيمة يتم تقييمها على أنها True. INSERT إذا لم يتم تعيين واصفة المفتاح الرئيسي للكائن أو إذا لم يحدِّث التحديث أي شيء مثلاً إذا تم تعيين ال pk على قيمة غير موجودة في قاعدة البيانات. بينما model.objects.create تقوم فقط بعملية INSERT. أيضاً إذا تم تعيين واصفة المفتاح الرئيسي على قيمة وكانت موجودة سابقاً، فإن Model.save سينفذ UPDATE، لكن Model.objects.create يعطي IntegrityError. أمثلة: # بفرض كان لدينا نموذج from django.db import models as m class f(m.Model): add = m.DateTimeField(auto_now_add=True) # دعنا نقوم بأخذ غرض من هذا الصف obj = f.objects.create(pk=1) #primary key الآن لو حاولنا إنشاء كائن له نفس ال # سينتج الخطأ التالي ob = f.objects.create(pk=1) # django.db.utils.IntegrityError: (1062, "Duplicate entry '1' for key 'PRIMARY'") ob = f(pk=1).save() # # django.db.utils.IntegrityError: (1048, "Column 'added' cannot be null") ليكن لدينا: class Subject(models.Model): subject_id = models.PositiveIntegerField(primary_key=True, db_column='subject_id') name = models.CharField(max_length=255) max_marks = models.PositiveIntegerField() # Insert/Update #model.save باستخدام #ML ل IT تغيير الاسم من # وتغيير العلامة من 77 ل 89 physics = Subject(subject_id=1, name='IT', max_marks=77) physics.save() math = Subject(subject_id=1, name='ML', max_marks=89) math.save() # النتيجة """ Subject.objects.all().values() <QuerySet [{'subject_id': 1, 'name': 'Math', 'max_marks': 50}]> """ # Model.objects.create # سيعطي خطأ Subject.objects.create(subject_id=1, name='Chemistry', max_marks=100) # IntegrityError: UNIQUE constraint failed: m****t.subject_id أيضاً Model.save تعيد None بيبنما create تعيد package_name.models.Model. ويمكننا أن نقوم بالحفظ من خلال create عن طريق جعله يسلك سلوك Model.save من خلال استخدام force_insert=True أي Model.save(force_insert=True). أي يمكن القول أن Model.objects.create يقوم بتهيئة النموذج ويقوم بالحفظ باستخدام force_insert = True. تم التعديل في 2 سبتمبر 2021 بواسطة Ali Haidar Ahmad 1 اقتباس
السؤال
Amer Abdallah
أريد أن أعرف الفرق بين السطرين التاليين:
هل يقوم الثاني على الفور بإنشاء TestModel في قاعدة البيانات ، بينما بالنسبة لـ ExampleModel ، يجب استدعاء التابع save () بشكل صريح لإضافته إلى قاعدة البيانات؟ أم أن هناك إختلاف آخر؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.