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

السؤال

نشر (معدل)

أحاول استخدام get_or_create لبعض الحقول في النماذجة models الخاصة بي، لكنني أتلقى خطأ 500 عندما أحاول القيام بذلك.

Cannot assign "(<Post: News>, False)": "User.post" 
   must be a "Post" instance.

يبدو السطر التالي هو السبب في ظهور الخطأ:

User.post = Post.objects.get_or_create(category="News")

 

تم التعديل في بواسطة Amer Abdallah

Recommended Posts

  • 1
نشر

يقوم التابع get_or_create بإرجاع tuple وليس كائن من نوع Post، وبالتالي يجب أن يكون لديك متغيرين قبل علامة الإسناد (علامة = )، يحتوي العنصر الأول في الـ tuple التي تم إرجاعها من هذا التابع على الكائن (في حالة تم الحصول عليه من قاعدة البيانات، أي من خلال عمل get)، أما العنصر الثاني في الـ tuple فهو قيمة منطقية True/False (تكون True في حالة تم إنشاء الكائن، وتكون False في حالة تم إرجاعه ولم يتم إنشاء كائن جديد في قاعدة البيانات).

User.post,created = Post.objects.get_or_create(category="News")

هنا مثال من توثيق Django:

# get_or_create() a person with similar first names.

p, created = Person.objects.get_or_create(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

# get_or_create()لم يقم التابع بإنشاء كائن في هذه الحالة
>>> created
False

 

  • 0
نشر

الاستخدام الصحيح للدالة هو كالتالي:

customer.source,created = Source.objects.get_or_create(name="News")

وهو يقوم بإرجاع tuple بحيث يكون العنصر الاول هو الكائن الذي تم ارجاعه بينما العنصر الثاني هي قيمة منطقية، اما صواب واما خطأ بحيث تشير الى اذا ما كان تم انشاء الكائن ام لا.

المثال التالي يوضح كيفية استخدامها:

p, created = country.objects.get_or_create(
    city='Cairo
    country='Egypt
)

>>> created
False

لاحظ أنه لم يتم إنشاء التابع لانه لم يتم ذكره بداخل defaults.

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...