জ্যাঙ্গো মডেল তৈরি করুন বা উপস্থিত থাকলে আপডেট করুন


115

আমি ব্যক্তির মতো একটি মডেল অবজেক্ট তৈরি করতে চাই, যদি ব্যক্তির আইডি উপস্থিত না থাকে, বা আমি সেই ব্যক্তিকে বস্তুটি পাই।

নিম্নলিখিত হিসাবে একটি নতুন ব্যক্তি তৈরি করার কোড:

class Person(models.Model):
    identifier = models.CharField(max_length = 10)
    name = models.CharField(max_length = 20)
    objects = PersonManager()

class PersonManager(models.Manager):
    def create_person(self, identifier):
        person = self.create(identifier = identifier)
        return person

তবে আমি জানি না যে বিদ্যমান ব্যক্তিকে কীভাবে পরীক্ষা করতে হবে এবং কীভাবে পেতে হবে।

উত্তর:


169

আপনি যদি ব্যবহারের ক্ষেত্রে "যদি আপডেট থাকে তবে অন্যটি তৈরি করা" আপডেটের সন্ধান করছেন, দয়া করে @ জাগস চমৎকার উত্তরটি দেখুন


জাজানো ইতিমধ্যে একটি get_or_create, https://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create রয়েছে

আপনার জন্য এটি হতে পারে:

id = 'some identifier'
person, created = Person.objects.get_or_create(identifier=id)

if created:
   # means you have created a new person
else:
   # person just refers to the existing one

আমি জাজানো ১.৯ ব্যবহার করছি এবং এটি আমাকে দিচ্ছে: অ্যাট্রিবিউটআরার: 'ক্যোয়ারীসেট' অবজেক্টটির 'আপডেট_অর_ক্রিয়েট' এর কোনও বৈশিষ্ট্য নেই
ওফেক গিলা

1
@ ওফেকগিলা এটি আশ্চর্যজনক, উত্স কোড এবং ডকুমেন্টেশন উভয়ই নিশ্চিত QuerySetকরেছেupdate_or_create
বাকল

2
আমার ক্ষেত্রে, শনাক্তকারীর জায়গায়, আমার ক্ষেত্রগুলির একটি গ্রুপ রয়েছে যা একচেটিয়া_রূপে গঠন করে। এই ক্ষেত্রে ব্যবহার কেমন?
রক্মো

191

তা স্পষ্ট আপনার প্রশ্নের জন্য জিজ্ঞাসা করা হয় কিনা এর get_or_create পদ্ধতি (অন্তত জ্যাঙ্গো 1.3 থেকে পাওয়া) অথবা update_or_create পদ্ধতি (জ্যাঙ্গো 1.7 নতুন)। এটি নির্ভর করে আপনি কীভাবে ব্যবহারকারীর অবজেক্টটি আপডেট করতে চান।

নমুনা ব্যবহার নিম্নরূপ:

# In both cases, the call will get a person object with matching
# identifier or create one if none exists; if a person is created,
# it will be created with name equal to the value in `name`.

# In this case, if the Person already exists, its existing name is preserved
person, created = Person.objects.get_or_create(
        identifier=identifier, defaults={"name": name}
)

# In this case, if the Person already exists, its name is updated
person, created = Person.objects.update_or_create(
        identifier=identifier, defaults={"name": name}
)

12
+1 update_or_createকারণ সেই ব্যবহারের ক্ষেত্রে get_or_createকেবলমাত্র save()বস্তুটিতে আবার কল করা ভাল better
বাকল

আমার ক্ষেত্রে, শনাক্তকারীর জায়গায়, আমার ক্ষেত্রগুলির একটি গ্রুপ রয়েছে যা একচেটিয়া_রূপে গঠন করে। এই ক্ষেত্রে ব্যবহার কেমন?
রক্মো

1
@ ওমকারদেশপান্ডে শনাক্তকারী একটি উদাহরণ; আপনি যেকোন বৈধ ডিজেঙ্গো কোয়েরিতে পাস করতে পারেন, যেমনPerson.objects.get_or_create(a=a, b=b, c=c, defaults={"name": name})
জাগস

আমি যদি ডিফল্ট ক্ষেত্রগুলির চেয়ে সৃষ্ট ব্যক্তিতে আরও ক্ষেত্র যুক্ত করতে চাই তবে কী হবে?
লো বেলিন

@ লোবেলিন defaultsএই ফাংশনগুলির যুক্তি হ'ল যেখানে আপনি মডেলটিতে কোন ক্ষেত্র যুক্ত করতে চান তা নির্দিষ্ট করে। আপনার মডেলের ক্ষেত্রগুলিতে নির্দিষ্ট করা ডিফল্টগুলির সাথে এর কোনও
যোগসূত্র নেই


4

শুধুমাত্র অল্প পরিমাণে অবজেক্টের জন্য আপডেট_অর_ক্রিয়েটটি ভাল কাজ করে তবে আপনি যদি একটি বৃহত সংগ্রহের কাজটি করেন তবে এটি ভাল স্কেল হবে না। update_or_create সর্বদা প্রথমে একটি নির্বাচন চালায় এবং তারপরে একটি আপডেট।

for the_bar in bars:
    updated_rows = SomeModel.objects.filter(bar=the_bar).update(foo=100)
        if not updated_rows:
            # if not exists, create new
            SomeModel.objects.create(bar=the_bar, foo=100)

এটি সর্বোত্তমভাবে শুধুমাত্র প্রথম আপডেট-ক্যোয়ারী চালাবে এবং এটি যদি শূন্য সারিগুলির সাথে মেলে তবেই অন্য INSERT- ক্যোরি চালায়। যদি আপনি বেশিরভাগ সারিটি বাস্তবে বিদ্যমান থাকার প্রত্যাশা করেন যা আপনার কর্মক্ষমতাটি বাড়িয়ে তুলবে।

যদিও এটি আপনার ব্যবহারের ক্ষেত্রে নেমে আসে। যদি আপনি বেশিরভাগ সন্নিবেশগুলি আশা করেন তবে সম্ভবত বাল্ক_ক্রিয়েট () কমান্ড একটি বিকল্প হতে পারে।


3

আপনার প্রশ্নের শিরোনাম দেখে মনে হচ্ছে যেহেতু এটি প্রশ্নের উত্তর শিরোনামে বর্ণিত হিসাবে কীভাবে তৈরি বা তৈরি করা উচিত তার চেয়ে কীভাবে তৈরি বা আপডেট করবেন তা জিজ্ঞাসা করছে looks

আপনার তৈরি অথবা একটি বস্তু আপডেট করতে চান করে থাকেন তাহলে, .save () মেথড ইতিমধ্যে ডিফল্টরূপে এই আচরণ থেকে হয়েছে ডক্স :

জ্যাঙ্গো INSERT বা আপডেটের এসকিউএল স্টেটমেন্টগুলি ব্যবহার করার প্রয়োজনটিকে বিমূর্ত করে। বিশেষত, যখন আপনি সংরক্ষণ () সংরক্ষণ কল করেন, জাজানো এই অ্যালগরিদম অনুসরণ করে:

যদি অবজেক্টের প্রাথমিক কী বৈশিষ্ট্যটি এমন কোনও মানকে সেট করা থাকে যা সত্যের কাছে মূল্যায়ন করে (যেমন, কোনওটি নয় বা খালি স্ট্রিং ছাড়া অন্য কোনও মান), জ্যাঙ্গো একটি আপডেট আপডেট করে। যদি অবজেক্টের প্রাথমিক কী বৈশিষ্ট্যটি সেট না করা থাকে বা যদি আপডেট আপডেট কিছু আপডেট না করে তবে জ্যাঙ্গো একটি INSERT কার্যকর করে।

এটি লক্ষণীয় যে তারা যখন 'আপডেট আপডেটে কিছু আপডেট না করে' বলে তখন তারা মূলত সেই ক্ষেত্রে উল্লেখ করে যেখানে আপনি যে আইডিটি দিয়েছিলেন সেই আইডিটি ডাটাবেসে ইতিমধ্যে উপস্থিত নেই।


1

আপনি তৈরি করার সময় যদি কোনও ইনপুট প্রাথমিক কী হয় তবে এটি যথেষ্ট হবে:

Person.objects.get_or_create(id=1)

একই প্রাথমিক কী সহ দুটি ডেটা অনুমোদিত না হওয়ায় এটি স্বয়ংক্রিয়ভাবে আপডেট হবে।

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