জ্যাঙ্গোর অনন্য বুলিয়ানফিল্ডের মান?


90

ধরুন আমার মডেল.পি এর মত:

class Character(models.Model):
    name = models.CharField(max_length=255)
    is_the_chosen_one = models.BooleanField()

আমি চাই আমার কেবলমাত্র একটি Characterউদাহরণ থাকুক is_the_chosen_one == Trueএবং অন্য সকলকে তা দেওয়া হোক is_the_chosen_one == False। আমি কীভাবে এই স্বতন্ত্রতা সীমাবদ্ধতার সম্মান করা যায় তা নিশ্চিত করতে পারি?

উত্তরগুলির শীর্ষস্থানীয় চিহ্ন যা ডাটাবেস, মডেল এবং (অ্যাডমিন) ফর্ম স্তরে সীমাবদ্ধতার সম্মান করার গুরুত্ব বিবেচনা করে!


4
ভাল প্রশ্ন. আমিও কৌতূহল করছি যদি এরকম বাঁধা সেট আপ করা সম্ভব হয়। আমি জানি যে আপনি যদি এটিকে কেবল একটি অনন্য বাধা তৈরি করেন তবে আপনি আপনার ডাটাবেসে কেবল দুটি সম্ভাব্য সারি দিয়ে শেষ করতে পারবেন ;-)
আন্দ্রে মিলার

অগত্যা নয়: আপনি যদি নালবুলিয়ানফিল্ড ব্যবহার করেন তবে আপনার তা হওয়া উচিত:
ম্যাথু শিংকেল

আমার গবেষণা অনুসারে , @ জবাবদিহিত উত্তর, ডাটাবেস, মডেল এবং (অ্যাডমিন) ফর্ম স্তরে সীমাবদ্ধতার প্রতি শ্রদ্ধার গুরুত্বকে বিবেচনা করে এবং এটি এমনকি একটি সীমাবদ্ধতার প্রয়োজন এমন একটি throughসারণির জন্য একটি দুর্দান্ত সমাধানও সরবরাহ করে। ManyToManyFieldunique_together
রারাটিড়ু

উত্তর:


66

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

class Character(models.Model):
    name = models.CharField(max_length=255)
    is_the_chosen_one = models.BooleanField()

    def save(self, *args, **kwargs):
        if self.is_the_chosen_one:
            try:
                temp = Character.objects.get(is_the_chosen_one=True)
                if self != temp:
                    temp.is_the_chosen_one = False
                    temp.save()
            except Character.DoesNotExist:
                pass
        super(Character, self).save(*args, **kwargs)

4
থেকে: আমি শুধুমাত্র পরিবর্তন চাই 'Def সংরক্ষণ (স্ব)': 'Def সংরক্ষণ (স্ব, * args, ** kwargs):'
Marek

8
আমি পরিবর্তন করতে এই সম্পাদনার চেষ্টা save(self)করার save(self, *args, **kwargs)কিন্তু সম্পাদন করা বাতিল করা হয়েছে। পর্যালোচকদের কেউ কেন ব্যাখ্যা করতে সময় নিতে পারে - যেহেতু এটি জ্যাঙ্গোর সেরা অনুশীলনের সাথে সামঞ্জস্যপূর্ণ বলে মনে হয়।
স্কাইটিলে

14
চেষ্টা করার প্রয়োজনটিকে বাদ দিয়ে / প্রক্রিয়াটিকে আরও দক্ষ করার জন্য আমি সম্পাদনার চেষ্টা করেছি তবে তা প্রত্যাখ্যান করা হয়েছিল .. get()চরিত্রের অবজেক্টটি সিএন করার পরিবর্তে এবং save()এটি আবার যুক্ত করার পরিবর্তে আপনাকে কেবল ফিল্টার এবং আপডেট করতে হবে যা কেবলমাত্র একটি এসকিউএল কোয়েরি তৈরি করে এবং ডিবিটিকে ধারাবাহিক রাখতে সহায়তা করে: if self.is_the_chosen_one:<নিউলাইন> Character.objects.filter(is_the_chosen_one=True).update(is_the_chosen_one=False)<নিউলাইন>super(Character, self).save(*args, **kwargs)
এলিস পারসিভাল

4
আমি এই কাজটি সম্পাদন করার জন্য আরও ভাল কোনও পদ্ধতির পরামর্শ দিতে পারি না তবে আমি বলতে চাই যে আপনি যদি কোনও ওয়েব অ্যাপ্লিকেশন চালাচ্ছেন তবে কোনও মুহুর্তে শেষ পয়েন্টে কয়েকটি অনুরোধ নিতে পারে এমন কোনও সংরক্ষণের বা সাফ পদ্ধতিতে বিশ্বাস করবেন না। আপনার এখনও অবশ্যই একটি নিরাপদ উপায়ে ডাটাবেস স্তরে প্রয়োগ করতে হবে।
u.unver34

4
নীচে আরও ভাল উত্তর আছে। এলিস পারসিভালের উত্তর transaction.atomicএখানে গুরুত্বপূর্ণ যা ব্যবহার করে । এটি একটি একক ক্যোয়ারী ব্যবহার করে আরও দক্ষ।
আলেকভান্ডারী

36

আমি মডেলের সংরক্ষণের পদ্ধতিটি ওভাররাইড করব এবং আপনি যদি বুলিয়ানটি সত্যে সেট করে থাকেন তবে নিশ্চিত হয়ে নিন যে অন্য সমস্ত মিথ্যাতে সেট করা আছে।

from django.db import transaction

class Character(models.Model):
    name = models.CharField(max_length=255)
    is_the_chosen_one = models.BooleanField()

    def save(self, *args, **kwargs):
        if not self.is_the_chosen_one:
            return super(Character, self).save(*args, **kwargs)
        with transaction.atomic():
            Character.objects.filter(
                is_the_chosen_one=True).update(is_the_chosen_one=False)
            return super(Character, self).save(*args, **kwargs)

আমি আদমের অনুরূপ উত্তরটি সম্পাদনা করার চেষ্টা করেছি, তবে মূল উত্তরটি খুব বেশি পরিবর্তনের জন্য এটি প্রত্যাখ্যান করা হয়েছিল। এই প্রবেশাধিকারটি আরও সুসংহত এবং দক্ষ কারণ অন্যান্য প্রবেশের পরীক্ষাগুলি একক ক্যোয়ারীতে করা হয়।


8
আমি মনে করি এটি সেরা উত্তর, তবে আমি saveকোনও @transaction.atomicলেনদেনের মোড়ক দেওয়ার পরামর্শ দেব । কারণ এটি ঘটতে পারে যে আপনি সমস্ত পতাকা সরিয়ে ফেলেন, কিন্তু তারপরে সংরক্ষণ ব্যর্থ হয় এবং আপনি চয়ন না করে সমস্ত অক্ষর শেষ করেন।
মিতার

এটা বলার জন্য ধন্যবাদ. আপনি একদম ঠিক আছেন এবং আমি উত্তর আপডেট করব।
এলিস পারসিভাল

@ মিটার @transaction.atomicজাতি অবস্থা থেকেও রক্ষা করে।
পাভেল ফুরমানিয়াক

4
সবার মাঝে সেরা সমাধান!
আর্টুরো

4
ট্রানজেকশন সম্পর্কিত at আমি প্রতিটি মডেলটিতে পারমাণবিক লেনদেন ব্যবহার করার কোনও কারণ দেখতে পাচ্ছি না কারণ বুলিয়ান ক্ষেত্রটি সত্য হলে এটিই কেবল গুরুত্বপূর্ণ। আমি with transaction.atomic:if এর ভিতরে সেফ করার পাশাপাশি if স্টেটমেন্টের ভিতরে ব্যবহার করার পরামর্শ দিচ্ছি । তারপরে অন্য একটি ব্লক যুক্ত করুন এবং অন্য ব্লকে সংরক্ষণ করুন।
আলেক্সভাণ্ডারী

29

কাস্টম মডেল পরিষ্কার / সংরক্ষণ ব্যবহার করার পরিবর্তে, আমি পদ্ধতিটিকে ওভাররাইড করে একটি কাস্টম ফিল্ড তৈরি করেছি । অন্য ক্ষেত্রটি থাকলে ত্রুটি উত্থাপনের পরিবর্তে, অন্যান্য ক্ষেত্রগুলি থাকলে তা তৈরি করেছিলাম । ক্ষেত্রটি ছিল এবং অন্য কোনও ক্ষেত্র না থাকলে ত্রুটি বাড়ানোর পরিবর্তেpre_savedjango.db.models.BooleanFieldTrueFalseTrueFalseTrue , আমি ক্ষেত্রটি সে হিসাবে সংরক্ষণ করেছিTrue

ক্ষেত্র.পি

from django.db.models import BooleanField


class UniqueBooleanField(BooleanField):
    def pre_save(self, model_instance, add):
        objects = model_instance.__class__.objects
        # If True then set all others as False
        if getattr(model_instance, self.attname):
            objects.update(**{self.attname: False})
        # If no true object exists that isnt saved model, save as True
        elif not objects.exclude(id=model_instance.id)\
                        .filter(**{self.attname: True}):
            return True
        return getattr(model_instance, self.attname)

# To use with South
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^project\.apps\.fields\.UniqueBooleanField"])

মডেল.পি

from django.db import models

from project.apps.fields import UniqueBooleanField


class UniqueBooleanModel(models.Model):
    unique_boolean = UniqueBooleanField()

    def __unicode__(self):
        return str(self.unique_boolean)

4
এটি অন্যান্য পদ্ধতির তুলনায় অনেক বেশি পরিষ্কার দেখায়
16.313

4
আমি এই সমাধানটিও খুব পছন্দ করি, যদিও অবজেক্টগুলি রাখা খুব বিপদজনক বলে মনে হয় upউপেটে অন্য সমস্ত বস্তুকে মিথ্যা হিসাবে সেট করে যেখানে ইউনিটবুলিয়ান মডেলগুলি সত্য। আরও ভাল হবে যদি ইউনিকবুলিয়ানফিল্ড অন্য বিষয়গুলিকে মিথ্যা হিসাবে সেট করা উচিত বা কোনও ত্রুটি উত্থাপন করা উচিত (অন্য বুদ্ধিমান বিকল্প) কিনা তা বোঝাতে একটি optionচ্ছিক যুক্তি গ্রহণ করে। এছাড়াও, এলিফটিতে আপনার মন্তব্যটি দেওয়া হয়েছে, যেখানে আপনি এই বৈশিষ্ট্যটিকে সত্যে সেট করতে চান, আমি মনে করি আপনার পরিবর্তন Return Trueকরা উচিত setattr(model_instance, self.attname, True)
অ্যান্ড্রু চেস

4
ইউনিকবুলিয়ানফিল্ডটি সত্যিই অনন্য নয় যেহেতু আপনি যতগুলি ভুয়া মান চান আপনার কাছে থাকতে পারে। আরও ভাল নাম কী হবে তা নিশ্চিত নই ... ওয়ানট্রুবুলিয়ানফিল্ড? আমি সত্যিই যা চাই তা হ'ল এটি একটি বিদেশী কী এর সাথে মিশ্রণে সক্ষম করতে যাতে আমার কাছে একটি বুলিয়ানফিল্ড থাকতে পারে যা সম্পর্কে প্রতি একবার সত্য হতে পারে (যেমন একটি ক্রেডিটকার্ডের একটি "প্রাথমিক" ক্ষেত্র এবং ব্যবহারকারীর কাছে একটি এফকে ব্যবহারকারীর / প্রাথমিক সমন্বয়টি ব্যবহারের জন্য একবারে সত্য) True সে ক্ষেত্রে আমি মনে করি সংরক্ষণের সংরক্ষণের চেয়ে অ্যাডামের উত্তর আমার পক্ষে আরও সোজা হবে।
অ্যান্ড্রু চেস

4
এটি লক্ষ করা উচিত যে এই পদ্ধতিটি আপনাকে এমন কোনও রাজ্যে শেষ করতে অনুমতি দেয় যাতে কোনও সারি সেট না করা trueথাকে যেন আপনি একমাত্র trueসারি মুছে ফেলেন।
rblk

11

নিম্নলিখিত সমাধানটি কিছুটা কুরুচিপূর্ণ তবে কার্যকর হতে পারে:

class MyModel(models.Model):
    is_the_chosen_one = models.NullBooleanField(default=None, unique=True)

    def save(self, *args, **kwargs):
        if self.is_the_chosen_one is False:
            self.is_the_chosen_one = None
        super(MyModel, self).save(*args, **kwargs)

আপনি যদি_স_চোসেন_ একটিকে মিথ্যা বা কোনও হিসাবে সেট করেন তবে এটি সর্বদা শূন্য থাকবে। আপনি যতটা চান নুল রাখতে পারেন তবে আপনার কাছে কেবল একটি সত্য হতে পারে।


4
প্রথম সমাধানটি আমিও ভেবেছিলাম। NULL সর্বদা অনন্য তাই আপনার সবসময় একাধিক NULL সহ কলাম থাকতে পারে।
ক্যালিসিন

10

এখানে উত্তরগুলির সাথে সাক্ষাত করার চেষ্টা করছি, আমি দেখতে পেলাম যে তাদের মধ্যে কেউ কেউ একই সমস্যাটিকে সফলভাবে সম্বোধন করেছে এবং প্রত্যেকে বিভিন্ন পরিস্থিতিতে উপযুক্ত:

আমি চয়ন করবে:

  • @ সেমেন্ত : ডেটাবেস, মডেল এবং অ্যাডমিন ফর্ম স্তরের প্রতিবন্ধকতাগুলি সম্মান করে যখন এটি জ্যাঙ্গো ওআরএমকে কমপক্ষে সম্ভব ওভাররাইড করে। তবুও এটা পারেসম্ভবতএকটি পরিস্থিতিতে একটি throughটেবিল ভিতরে ব্যবহার করা।ManyToManyFieldunique_together(আমি এটি পরীক্ষা করে রিপোর্ট করব)

    class MyModel(models.Model):
        is_the_chosen_one = models.NullBooleanField(default=None, unique=True)
    
        def save(self, *args, **kwargs):
            if self.is_the_chosen_one is False:
                self.is_the_chosen_one = None
            super(MyModel, self).save(*args, **kwargs)
    
  • @ এলিস পার্সিভাল : ডাটাবেসকে মাত্র একটি অতিরিক্ত সময় হিট করে এবং নির্বাচিত হিসাবে বর্তমান এন্ট্রি গ্রহণ করে। পরিষ্কার এবং মার্জিত।

    from django.db import transaction
    
    class Character(models.Model):
        name = models.CharField(max_length=255)
        is_the_chosen_one = models.BooleanField()
    
    def save(self, *args, **kwargs):
        if not self.is_the_chosen_one:
            # The use of return is explained in the comments
            return super(Character, self).save(*args, **kwargs)  
        with transaction.atomic():
            Character.objects.filter(
                is_the_chosen_one=True).update(is_the_chosen_one=False)
            # The use of return is explained in the comments
            return super(Character, self).save(*args, **kwargs)  
    

অন্যান্য সমাধানগুলি আমার ক্ষেত্রে উপযুক্ত নয় তবে কার্যকর হবে:

@nemocorpclean একটি বৈধতা সম্পাদন করার পদ্ধতিটিকে ওভাররাইড করছে । তবে এটি কোন মডেলটি "এক" এবং এটি ব্যবহারকারী বান্ধব নয় তা ফেরত রিপোর্ট করে না। তা সত্ত্বেও, এটি খুব সুন্দর পদ্ধতির বিশেষত যদি কেউ @ ফ্লাইটের মতো আক্রমণাত্মক হওয়ার ইচ্ছা না রাখে।

@ সল.শানাব্রুক এবং @ থিরি জে একটি কাস্টম ফিল্ড তৈরি করবে যা অন্য কোনও "is_the_one" এন্ট্রি পরিবর্তন করবেFalse বা বাড়িয়েValidationError । আমার জ্যাঙ্গো ইন্সটলেশনটিতে নতুন বৈশিষ্ট্যগুলি অভিযুক্ত করতে অনিচ্ছুক, যদি না এটি অপ্রয়োজনীয়ভাবে প্রয়োজন হয়।

@ ডাইগোরোকাব : জ্যাঙ্গো সিগন্যাল ব্যবহার করে। আমি এটি একটি অনন্য পদ্ধতির সন্ধান করি এবং কীভাবে জ্যাঙ্গো সিগন্যালগুলি ব্যবহার করতে হয় তার একটি ইঙ্গিত দেয় । তবে আমি নিশ্চিত নই যে এটি একটি কঠোরভাবে বলার- সিগন্যালের "যথাযথ" ব্যবহার, যেহেতু আমি এই পদ্ধতিটিকে "ডিকোপলড অ্যাপ্লিকেশন" এর অংশ হিসাবে বিবেচনা করতে পারি না।


পর্যালোচনার জন্য ধন্যবাদ! আপনি যদি নিজের কোডটি এখানেও আপডেট করতে চান তবে একটি মন্তব্যের উপর ভিত্তি করে আমি আমার উত্তরটি কিছুটা আপডেট করেছি।
এলিস পারসিভাল

@ এলিসপারসিভাল ইঙ্গিতটির জন্য আপনাকে ধন্যবাদ! আমি সেই অনুযায়ী কোড আপডেট করেছি। মনে রাখবেন যে মডেলগুলি.মোডেল.সেজ () কিছু ফেরায় না।
রারাটিড়ু

সেটা ঠিক আছে. এটি বেশিরভাগই কেবল নিজের লাইনে প্রথম রিটার্নটি সংরক্ষণ করার জন্য। আপনার সংস্করণটি আসলে ভুল, কারণ এটি পারমাণবিক লেনদেনে .save () অন্তর্ভুক্ত করে না। এছাড়াও, পরিবর্তে এটি 'ট্রানজেকশন সহ' হওয়া উচিত।
এলিস পারসিভাল

4
@ এলিসপারসিভাল ঠিক আছে, আপনাকে ধন্যবাদ! প্রকৃতপক্ষে, আমাদের ফিরে সমস্ত ঘূর্ণিত দরকার, save()অপারেশন ব্যর্থ হওয়া উচিত !
রারাটিড়ু

6
class Character(models.Model):
    name = models.CharField(max_length=255)
    is_the_chosen_one = models.BooleanField()

    def save(self, *args, **kwargs):
        if self.is_the_chosen_one:
            qs = Character.objects.filter(is_the_chosen_one=True)
            if self.pk:
                qs = qs.exclude(pk=self.pk)
            if qs.count() != 0:
                # choose ONE of the next two lines
                self.is_the_chosen_one = False # keep the existing "chosen one"
                #qs.update(is_the_chosen_one=False) # make this obj "the chosen one"
        super(Character, self).save(*args, **kwargs)

class CharacterForm(forms.ModelForm):
    class Meta:
        model = Character

    # if you want to use the new obj as the chosen one and remove others, then
    # be sure to use the second line in the model save() above and DO NOT USE
    # the following clean method
    def clean_is_the_chosen_one(self):
        chosen = self.cleaned_data.get('is_the_chosen_one')
        if chosen:
            qs = Character.objects.filter(is_the_chosen_one=True)
            if self.instance.pk:
                qs = qs.exclude(pk=self.instance.pk)
            if qs.count() != 0:
                raise forms.ValidationError("A Chosen One already exists! You will pay for your insolence!")
        return chosen

উপরের ফর্মটি আপনি অ্যাডমিনের জন্যও ব্যবহার করতে পারেন, কেবল ব্যবহার করুন

class CharacterAdmin(admin.ModelAdmin):
    form = CharacterForm
admin.site.register(Character, CharacterAdmin)

4
class Character(models.Model):
    name = models.CharField(max_length=255)
    is_the_chosen_one = models.BooleanField()

    def clean(self):
        from django.core.exceptions import ValidationError
        c = Character.objects.filter(is_the_chosen_one__exact=True)  
        if c and self.is_the_chosen:
            raise ValidationError("The chosen one is already here! Too late")

এটি করার ফলে বৈধতাটিকে বেসিক অ্যাডমিন ফর্মটিতে উপলব্ধ করা হয়


4

জ্যাঙ্গো সংস্করণ ২.২-এর পরে আপনার মডেলটিতে এই ধরণের বাধা যুক্ত করা সহজ simp আপনি সরাসরি ব্যবহার করতে পারেন UniqueConstraint.conditionজ্যাঙ্গো ডক্স

আপনার মডেলগুলি কেবল এ জাতীয় ওভাররাইড করুন class Meta:

class Meta:
    constraints = [
        UniqueConstraint(fields=['is_the_chosen_one'], condition=Q(is_the_chosen_one=True), name='unique_is_the_chosen_one')
    ]


2

শৌলের মতো অনুরূপ পন্থা ব্যবহার করা, তবে কিছুটা ভিন্ন উদ্দেশ্য:

class TrueUniqueBooleanField(BooleanField):

    def __init__(self, unique_for=None, *args, **kwargs):
        self.unique_for = unique_for
        super(BooleanField, self).__init__(*args, **kwargs)

    def pre_save(self, model_instance, add):
        value = super(TrueUniqueBooleanField, self).pre_save(model_instance, add)

        objects = model_instance.__class__.objects

        if self.unique_for:
            objects = objects.filter(**{self.unique_for: getattr(model_instance, self.unique_for)})

        if value and objects.exclude(id=model_instance.id).filter(**{self.attname: True}):
            msg = 'Only one instance of {} can have its field {} set to True'.format(model_instance.__class__, self.attname)
            if self.unique_for:
                msg += ' for each different {}'.format(self.unique_for)
            raise ValidationError(msg)

        return value

এই বাস্তবায়নটি ValidationErrorসত্যের মান সহ অন্য রেকর্ড সংরক্ষণের চেষ্টা করার সময় উত্থাপন করবে ।

এছাড়াও, আমি unique_forযুক্তিটি যুক্ত করেছি যা মডেলটির অন্য যে কোনও ক্ষেত্রে সেট করা যেতে পারে, কেবল একই মান সহ রেকর্ডগুলির জন্য সত্য-স্বতন্ত্রতা পরীক্ষা করতে, যেমন:

class Phone(models.Model):
    user = models.ForeignKey(User)
    main = TrueUniqueBooleanField(unique_for='user', default=False)

1

আমি কি আমার প্রশ্নের উত্তর দেওয়ার জন্য পয়েন্ট পেতে পারি?

সমস্যাটি ছিল এটি লুপটিতে নিজেকে আবিষ্কার করেছিল, এটি দ্বারা স্থির করে:

    # is this the testimonial image, if so, unselect other images
    if self.testimonial_image is True:
        others = Photograph.objects.filter(project=self.project).filter(testimonial_image=True)
        pdb.set_trace()
        for o in others:
            if o != self: ### important line
                o.testimonial_image = False
                o.save()

না, আপনার নিজের প্রশ্নের উত্তর দেওয়ার এবং সেই উত্তরটি স্বীকার করার জন্য কোনও পয়েন্ট নেই। যাইহোক, যদি কেউ আপনার উত্তরটিকে সমর্থন করে তবে পয়েন্টগুলি তৈরি করতে হবে। :)
dandan78

আপনি কি নিশ্চিত যে এর পরিবর্তে এখানে আপনার নিজের প্রশ্নের উত্তর দেওয়ার অর্থ ছিল না ? মূলত আপনার এবং @ সাম্পাব্লুকপারের একই প্রশ্ন ছিল
j_syk

1

আমি এই সমাধানগুলির কয়েকটি চেষ্টা করেছি এবং কেবল কোডের সংক্ষিপ্ততার জন্য (ফর্মগুলি ওভাররাইড করতে বা পদ্ধতিটি সংরক্ষণ করার দরকার নেই) এর জন্য অন্য একটি দিয়ে শেষ করেছি। এটি কাজ করার জন্য, ক্ষেত্রটি এর সংজ্ঞাতে অনন্য হতে পারে না তবে সংকেত তা নিশ্চিত হয়ে যায় happens

# making default_number True unique
@receiver(post_save, sender=Character)
def unique_is_the_chosen_one(sender, instance, **kwargs):
    if instance.is_the_chosen_one:
        Character.objects.all().exclude(pk=instance.pk).update(is_the_chosen_one=False)

0

নতুনদের জন্য জিনিসগুলিকে কম জটিল করার জন্য 2020 আপডেট:

class Character(models.Model):
    name = models.CharField(max_length=255)
    is_the_chosen_one = models.BooleanField(blank=False, null=False, default=False)

    def save(self):
         if self.is_the_chosen_one == True:
              items = Character.objects.filter(is_the_chosen_one = True)
              for x in items:
                   x.is_the_chosen_one = False
                   x.save()
         super().save()

অবশ্যই, আপনি যদি অনন্য বুলিয়ানটি মিথ্যা হতে চান তবে আপনি সত্যের প্রতিটি উদাহরণকে মিথ্যা এবং এর বিপরীতে বদলাবেন ap

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