জ্যাঙ্গো মডেলগুলিতে ক্রিয়েট_ফু () সংজ্ঞায়িত করুন কেন ওভাররাইড তৈরির পরিবর্তে ম্যানেজার ()?


10

পড়া জ্যাঙ্গো ডক্স , এটা নামে একটি মডেল জন্য একটি কাস্টম সৃষ্টি পদ্ধতি করতে পরামর্শ Fooযেমন সংজ্ঞা দ্বারা create_fooপরিচালকে:

class BookManager(models.Manager):
    def create_book(self, title):
        book = self.create(title=title)
        # do something with the book
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)

    objects = BookManager()

book = Book.objects.create_book("Pride and Prejudice")

আমার প্রশ্নটি হল যে পূর্ববর্তীটি কেবল বেস শ্রেণীর createপদ্ধতির উপর নির্ভর করে কেন অগ্রাধিকার দেয় :

class BookManager(models.Manager):
    def create(self, title):
        book = self.model(title=title)
        # do something with the book
        book.save()
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)

    objects = BookManager()

book = Book.objects.create("Pride and Prejudice")

ইমো দেখে মনে হচ্ছে যে কেবলমাত্র ওভাররাইডিং createএটিকে দুর্ঘটনাক্রমে কোনও দুর্নীতিবাজ মডেল উদাহরণ তৈরি create_fooকরতে বাধা দেবে , যেহেতু সর্বদা সম্পূর্ণভাবে বাইপাস করা যায়:

class BookManager(models.Manager):
    def create_book(self, title):
        book = self.create(title=title, should_not_be_set_manually="critical text")
        return book

class Book(models.Model):
    title = models.CharField(max_length=100)
    should_not_be_set_manually = models.CharField(max_length=100)

    objects = BookManager()

# Can make an illformed Book!!
book = Book.objects.create(title="Some title", should_not_be_set_manually="bad value")

ডক্সের পরামর্শ মতো এটি করার কোনও সুবিধা কি আছে বা আসলে createউদ্দেশ্যমূলকভাবে আরও ভালভাবে অগ্রাহ্য হচ্ছে ?

উত্তর:


10

হ্যাঁ, স্পষ্টতই, আপনি এটি করতে পারেন। আপনি যদি ডকুমেন্টেশন থেকে যে উদাহরণটি উদ্ধৃত করছেন তার কাছাকাছি ঘুরে দেখেন তবে আপনার তৈরিটি ওভাররাইড করা উচিত কিনা তা নয়, এটি সম্পর্কে

তবে যদি আপনি এটি করেন তবে কলিং স্বাক্ষরটি পরিবর্তন না করার যত্ন নিন কারণ কোনও পরিবর্তন মডেল উদাহরণটি সংরক্ষণ থেকে বাঁচতে পারে।

কলিং স্বাক্ষর সংরক্ষণ করা । কারণ আপনার জন্য উপলব্ধ ইন্টারফেসগুলি অভ্যন্তরীণভাবে জাঙ্গো দ্বারা ব্যবহৃত হতে পারে। আপনি যদি এগুলি সংশোধন করেন তবে জিনিসগুলি আপনার জন্য না জাজঙ্গোর জন্য ভেঙে যেতে পারে।

এই উদাহরণে, তারা এটির জন্য প্রস্তাব দিচ্ছে না create নয় বরং মডেল কনস্ট্রাক্টরের ।

দ্বিতীয়ত , এমনকি মানক ইন্টারফেসটি createকেবল কীওয়ার্ড আর্গুমেন্ট গ্রহণ করে

def create(self, **kwargs):

তবে আপনি যদি অবস্থানগত আর্গুমেন্টগুলি গ্রহণের জন্য এটি পরিবর্তন করেন তবে এটি def create(self, title):জাঙ্গোর অভ্যন্তরে বা স্ট্যান্ডার্ড পদ্ধতিতে যেখানেই ব্যবহৃত হবে এটি ভেঙে যাবে। সুতরাং আপনার বিদ্যমান কার্যকারিতা প্রসারিত করা উচিত যা সংশোধন না করা এবং সম্ভবত এটি ভঙ্গ করা উচিত।

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