اذهب إلى المحتوى

السؤال

نشر

أريد أن أعرف الفرق بين السطرين التاليين:

example = ExampleModel()

test = TestModel.objects.create()

هل يقوم الثاني على الفور بإنشاء TestModel في قاعدة البيانات ، بينما بالنسبة لـ ExampleModel ، يجب استدعاء التابع save () بشكل صريح لإضافته إلى قاعدة البيانات؟ أم أن هناك إختلاف آخر؟ 

Recommended Posts

  • 1
نشر

ما تعتقده صحيح، حيث في السطر الأول يجب أن تستدعي التابع 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 من هذا النموذج.

  • 0
نشر (معدل)

هناك اختلافات بين هذين الأمرين:
بالنسبة لعمليتي ال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.

تم التعديل في بواسطة Ali Haidar Ahmad

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...