কোনও মডেলগুলিতে কেবল নির্দিষ্ট ক্ষেত্রগুলি আপডেট করুন od মডেল


92

আমার একটা মডেল আছে

class Survey(models.Model):
    created_by = models.ForeignKey(User)
    question = models.CharField(max_length=150)
    active = models.NullBooleanField()
    def __unicode__(self):
        return self.question

এবং এখন আমি কেবল activeক্ষেত্রটি আপডেট করতে চাই । সুতরাং আমি এটি করি:

survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"]) 

এখন আমি একটি ত্রুটি পেয়েছি IntegrityError: PRIMARY KEY must be unique

আমি কি এই পদ্ধতিটি আপডেট করার জন্য ঠিক আছি?

উত্তর:


187

ক্ষেত্রগুলির একটি উপসেট আপডেট করতে, আপনি ব্যবহার করতে পারেন update_fields:

survey.save(update_fields=["active"]) 

update_fieldsযুক্তি জ্যাঙ্গো 1.5 যোগ করা হয়েছিল। পূর্ববর্তী সংস্করণগুলিতে, আপনি এর update()পরিবর্তে পদ্ধতিটি ব্যবহার করতে পারেন :

Survey.objects.filter(pk=survey.pk).update(active=True)

17

সাধারণত, এক বা একাধিক মডেল দৃষ্টান্তে নির্দিষ্ট ক্ষেত্রগুলি আপডেট করার সঠিক update()উপায়টি সম্পর্কিত ক্যোয়ারসেটে পদ্ধতিটি ব্যবহার করা । তারপরে আপনি এরকম কিছু করুন:

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)

এইভাবে, আপনাকে save()আর আপনার মডেলটিতে কল করার দরকার নেই কারণ এটি স্বয়ংক্রিয়ভাবে সংরক্ষণ হয়ে যায়। এছাড়াও, update()পদ্ধতিটি আপনার আপডেট দ্বারা প্রভাবিত হওয়া সমীক্ষার সংখ্যার সংখ্যা প্রদান করে।


4
ধন্যবাদ আমি এর .getপরিবর্তে এটি চেষ্টা করেছি .filterএবং এটি কাজ করে না। তবে ফিল্টার সহ এটি দুর্দান্ত কাজ করে। আপনি কি জানেন আমার উপরের কোডটিতে কী ভুল আছে?
নিবন্ধিত ব্যবহারকারী

আপনার সমস্যা সম্পর্কিত হতে পারে question_id। এই মানটি কোথা থেকে আসে? এবং কোন সঠিক লাইন উত্থাপন করে IntegrityError?
pemistahl

question_idইউআরএল থেকে আসে (?P<question_id>\d+)। আমার দোষ ছিল যে ওয়ার্কিং সার্ভারে জাঙ্গো 1.4 ইনস্টল করা আছে এবং আমার কোডটি 1.5 হয় 1.5 তবে আপনার কোড দিয়ে এটি ঠিকঠাক কাজ করছে।
ব্যবহারকারী

4
@ নিবন্ধিত ব্যবহারকারী, দেখে মনে হচ্ছে অবজেক্টগুলির জন্য কেবল আপডেটগুলি নেই, "আপডেট" পদ্ধতি আছে ts আপনি যখন ফিল্টার () ব্যবহার করেন, তখন আপনি একটি ক্যোরিসেট (শূন্য বা আরও বেশি অবজেক্ট ধারণ করে) ফিরে পাবেন। আপনি যখন .get () ব্যবহার করেন আপনি একটি একক বস্তু পান।
এমজিওজন

ডিফল্টরূপে, save()(@ আলাসডায়ার সলিউশন) কল করা একটি নিরাপদ সমাধান, কারণ এই পদ্ধতিটি বৈধতা বা কোনও কাস্টম কোডের মতো জিনিসগুলিকে ট্রিগার করতে পারে update()
ডেভিড ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.