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

السؤال

نشر

في قاعدة البيانات، أريد إضافة كائن آخر وهو نسخة من الكائن الذي لدي بالفعل. لنفترض أن لدي جدول به صف واحد. أرغب في إدراج نسخة من هذا الكائن في صف آخر باستخدام مفتاح أساسي Primary Key مختلف. كيف أقوم بذلك؟

Recommended Posts

  • 1
نشر

يمكنك أن تقوم بذلك بأكثر من طريقة وأسهلهم هي من خلال عمل نسخة من الكائن وجعل الـ Primary Key يساوي None، كالتالي:

obj = User.objects.get(pk=1)
obj.pk = None
obj.save()

الكود السابق يقوم بجلب instance من الكائن ثم نقوم بجعل الـ id بقيمة None، وبالتالي عند تشغيل التابع save سوف يقوم بعمل صف جديد في قاعدة البيانات.

بالطبع يمكنك أن تقوم بتحديث/تعديل الكائم قبل حفظه بشكل طبيعي، كما ينصح توثيق Django أن تقوم بجعل الخاصية _state.adding تساوي True، لكي تتم عملية إنشاء كائن جديد بشكل سليم كالتالي:

post = Post(title='My first blogpost', summary='Blogging is easy')
post.save() # post.pk == 1

post.pk = None
post._state.adding = True
post.save() # post.pk == 2

عملية الحفظ الأولى سوف تقوم بإنشاء أول صف في الجدول في قاعدة البيانات، بينما عملية الحفظ الثانية سوف تقوم بعمل صف جديد في نفس الجدول.

  • 0
نشر

إضافة لما قدمه سامح يمكنك القيام بما يلي:

from copy import deepcopy as c
new_obj = c(object_you_want_copied)
new_obj.id = None
new_obj.save()

هذه الطريقة لا تقوم باستدعاء قاعدة البيانات لاسترداد كائن. وهذا يجعلها مفيدة  إذا كنت تريد إنشاء نسخة من كائن غير موجود حتى الآن في قاعدة البيانات.
وهنا طريقة أخرى أيضاً لاستنساخ كائن:

from django.forms import model_to_dict
obj = Some.objects.get(slug='something')
par = model_to_dict(instance, exclude=['id'])
new_obj = Some.objects.create(**par)

أو يمكنك استنساخه كالتالي:

d = Foo.objects.filter(pk=1).values().first()   
d.update({'id': None})
duplicate = Foo.objects.create(**d)

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...