Get_or_create ব্যবহারের সঠিক উপায়?


203

আমি আমার ফর্মের কিছু ক্ষেত্রের জন্য get_or_create ব্যবহার করার চেষ্টা করছি, কিন্তু যখন আমি এটি করার চেষ্টা করব তখন আমি 500 ত্রুটি পাচ্ছি।

এর মধ্যে একটি লাইন এর মতো দেখাচ্ছে:

customer.source = Source.objects.get_or_create(name="Website")

উপরের কোডটির জন্য আমি যে ত্রুটিটি পেয়েছি তা হ'ল:

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.

উত্তর:


353

ডকুমেন্টেশন থেকে get_or_create :

# 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() didn't have to create an object.
>>> created
False

ব্যাখ্যা: মিলের জন্য ক্ষেত্রগুলি মূল্যায়নের জন্য, বাইরে উল্লেখ করতে হবে defaults। বাকি ক্ষেত্রগুলি এতে অন্তর্ভুক্ত করতে হবে defaults। যদি ক্রিয়েট ইভেন্ট হয় তবে সমস্ত ক্ষেত্র বিবেচনায় নেওয়া হবে।

দেখে মনে হচ্ছে আপনার একক ভেরিয়েবলের পরিবর্তে একটি টুপলে ফিরে আসা দরকার:

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

3
এফওয়াইআই তৈরি করা একটি বুলিয়ান। এটি তৈরি করা হলে সত্য, এটি আনলে মিথ্যা
জোশ

3
অতিরিক্ত অতিরিক্ত save()নিরর্থক?
জাইপ্রো

@ জাইপ্রো এটির মতো create(), অবজেক্ট তৈরি করুন এবং সমস্ত কিছু এক ধাপে সংরক্ষণ করুন এবং কোনও দরকার নেইsave()
আমিন মীর

32

get_or_create একটি tuple ফেরত।

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

16
বা, যদি আপনি customer.source = Source.objects.get_or_create(name="Website")[0]
বুলেটিয়ান

7
@ মিপাদি আমার পছন্দ হবে customer.source, _ = Source.objects.get_or_create(name="Website"), কারণ এটি সত্য যে ভবিষ্যতের বাগগুলি এড়াতে সাহায্য করে একটি ডুপল আরও সুস্পষ্টভাবে ফিরে এসেছিল makes
সলোমন উকো

15

get_or_create() একটি tuple ফেরত:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created এর একটি বুলিয়ান মান রয়েছে, তৈরি হয় বা তৈরি হয়।

  • customer.source Method এর get_or_create()পদ্ধতির একটি অবজেক্ট রয়েছে ।


12

@ তোবু উত্তর এবং @ মিপাডি মন্তব্য অনুসরণ করে আরও পাইথোনিক উপায়ে তৈরি করা পতাকার প্রতি আগ্রহী না হলে আমি ব্যবহার করব:

customer.source, _ = Source.objects.get_or_create(name="Website")

4

আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা হ'ল একটি নথিযুক্ত বৈশিষ্ট্য get_or_create

"ডিফল্ট" ব্যতীত কীওয়ার্ড আর্গুমেন্টগুলি ব্যবহার করার সময় এর মূল্য ফেরতের মান get_or_create। এজন্য এটি আপনাকে ফেরতের মূল্যে প্যারেন্স দেখাচ্ছে।

আপনি customer.source = Source.objects.get_or_create(name="Website")[0]সঠিক মান পেতে ব্যবহার করতে পারেন ।

এখানে নথিপত্রের জন্য একটি লিঙ্ক আছে: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.