একটি একক ক্যোরিসেটের সাহায্যে ডাটাবেস রেকর্ডটি নির্বাচন করুন এবং আপডেট করুন


139

আমি দুটি জিজ্ঞাসা না করে কীভাবে একই সাথে একটি updateএবং selectবিবৃতি চালাতে querysetপারি: - একটি অবজেক্টটি নির্বাচন করা - এবং একটিতে অবজেক্ট আপডেট করার জন্য

এসকিউএল এর সমতুল্য কিছু হবে:

update my_table set field_1 = 'some value' where pk_field = some_value

উত্তর:


267

ক্যোরিসেট অবজেক্ট updateপদ্ধতিটি ব্যবহার করুন :

MyModel.objects.filter(pk=some_value).update(field1='some value')

95
কেবল একটি যথাযথ সতর্কতা ... আপনি যদি updateএই পদ্ধতিটি ব্যবহার করেন তবে সেই মডেল বা অন্যান্য "কোড স্টাফ" এর সাথে সংযুক্ত কোনও সংকেত বস্তুর বিরুদ্ধে চলবে না। আগুনে পুড়ে যাওয়া কারও কাছ থেকে কেবল একটি পয়েন্টার :)
ডিএম্যাক দ্য ডাস্ট্রোয়ার

@DMacheDestroyer বন্ধু এই মূল্যবান তথ্যের জন্য ধন্যবাদ। তারপরে কি আমাদের এটি আপডেট করার পুরানো উপায়টি ব্যবহার করা উচিত? (ie) পেতে এবং সংরক্ষণ?

@ ভাল বন্ধু, এটি আপনার দৃশ্যের উপর নির্ভর করে। updateপদ্ধতি ভর আপডেটের জন্য মহান, কিন্তু এটা বন্ধ আপনার মাথা একটি সতর্কবার্তা যখন আপনি এটি ব্যবহার যে আপনি কোনো যে বস্তুর যে নিজে হতে পারে সংযুক্ত সংকেত পর্যালোচনা করা প্রয়োজন বহিস্কার সেট করা উচিত
DMac ধ্বংসকারী

3
আপডেট ফাংশনে বর্তমান মডেল উদাহরণটি অ্যাক্সেস করা সম্ভব? পছন্দMyModel.objects.filter(pk=some_value).update(field1=self.data)
দিপাক

8
@ দিপাকচন্দ্রনপি আপনার ছয় বছরের বাচ্চাটির উপর মন্তব্য করার পরিবর্তে একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত। তবে এফ () এক্সপ্রেশন সম্ভবত আপনি চান চান।
ড্যানিয়েল রোজম্যান

70

জ্যাঙ্গো ডাটাবেস অবজেক্টগুলি অবজেক্ট তৈরি এবং পরিবর্তনের জন্য একই সংরক্ষণ () পদ্ধতিটি ব্যবহার করে।

obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()

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

তথ্যসূত্র: https://docs.djangoproject.com/en/1.9/ref/models/inferences/


17

এই উত্তরটি উপরোক্ত দুটি পদ্ধতির তুলনা করে। আপনি যদি একক লাইনে অনেকগুলি অবজেক্ট আপডেট করতে চান তবে যান:

# Approach 1
MyModel.objects.filter(field1='Computer').update(field2='cool')

অন্যথায় আপনাকে কোয়েরি সেটটি নিয়ে পুনরাবৃত্তি করতে হবে এবং স্বতন্ত্র বস্তুগুলি আপডেট করতে হবে:

#Approach 2    
objects = MyModel.objects.filter(field1='Computer')
for obj in objects:
    obj.field2 = 'cool'
    obj.save()
  1. পদ্ধতির 1 দ্রুততর কারণ এটি 2 টি পদ্ধতির তুলনায় কেবল একটি ডাটাবেস ক্যোয়ারী তৈরি করে যা 'এন + 1' ডাটাবেস অনুসন্ধান করে eries (ক্যোয়ারী সেট n টি আইটেমের জন্য)

  2. মুষ্টি পদ্ধতির একটি ডিবি ক্যোয়ারী তৈরি করে অর্থাত্ আপডেট, দ্বিতীয়টি দুটি করে: নির্বাচন করুন এবং তারপরে আপডেট করুন।

  3. ট্রেডঅফটি হ'ল, ধরুন আপনার কোনও ট্রিগার রয়েছে, যেমন আপডেট করার মতো updated_onবা এর সাথে সম্পর্কিত কোনও ক্ষেত্র, এটি সরাসরি আপডেটে অর্থাৎ ট্রিগল 1 এ ট্রিগার করা হবে না।

  4. অ্যাপ্রোচ 1 একটি ক্যোরিসেটে ব্যবহৃত হয়, সুতরাং পদ্ধতির 2 এর ক্ষেত্রে নয়, একসাথে একাধিক অবজেক্ট আপডেট করা সম্ভব।


1 সম্পর্কে - আমি মনে করি ক্যোয়ারির ফলাফলটি প্রথম কলটিতে ক্যোয়ারিতে ক্যাশে হয়ে যায়, সুতরাং ডিবিতে এখনও কেবল একটি কল রয়েছে।
ব্যবহারকারী 2340939

2

শুধুমাত্র serializerকিছু ক্ষেত্রে , আপনি খুব সহজ উপায়ে আপডেট করতে পারেন!

my_model_serializer = MyModelSerializer(
    instance=my_model, data=validated_data)
if my_model_serializer.is_valid():

    my_model_serializer.save()

কেবল কোনও ক্ষেত্রে form!

instance = get_object_or_404(MyModel, id=id)
form = MyForm(request.POST or None, instance=instance)
if form.is_valid():
    form.save()

আমি মনে করি সিরিয়ালাইজারগুলি ডিজনোগ রেস্ট ফ্রেমওয়ার্ক থেকে এসেছে এবং জ্যাঙ্গো যথাযথ নয়।
কোড-শিক্ষানবিশ

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