Neden create () yerine geçersiz kılmak yerine bir Django modelinde.


10

Django belgelerini okurken, yöneticide Fooolduğu gibi tanımlayarak adlandırılan bir model için özel bir oluşturma yöntemi oluşturmayı create_fooönerir:

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")

Benim sorum neden öncekini sadece temel sınıfın createyöntemini geçersiz kılmak için tercih edilir :

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")

Imo, sadece geçersiz createkılmanın, herkesin yanlışlıkla biçimlendirilmiş bir model örneği oluşturmak için yanlışlıkla kullanmasını önleyeceği görülüyor, çünkü create_fooher zaman tamamen atlanabilir:

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")

Dokümanların önerdiği gibi yapmanın herhangi bir avantajı var mı, yoksa aslında createobjektif olarak daha iyi mi?

Yanıtlar:


10

Evet, tabii ki bunu yapabilirsiniz. Ancak, belgelerden alıntıladığınız örneğe daha yakından bakarsanız, oluşturmayı geçersiz kılmanız gerekip gerekmediğiyle ilgili değildir,

Ancak bunu yaparsanız, arama imzasını değiştirmemeye dikkat edin, çünkü herhangi bir değişiklik model örneğinin kaydedilmesini engelleyebilir.

çağrı imzasını korumak . Çünkü sizin için mevcut olan arayüzler django tarafından dahili olarak da kullanılabilir. Onları değiştirirseniz, işler sizin için değil, Django için kırılabilir.

Bu örnekte, bunu createmodel yapıcı için önermiyorlar.

İkincisi , için standart arayüz bile createsadece anahtar kelime argümanları alıyor

def create(self, **kwargs):

Ancak konumsal argümanlar almak için değiştirirseniz, def create(self, title):Django içinde veya standart şekilde kullanıldığı her yerde kırılır. Bu nedenle, mevcut işlevselliği değiştirmeyecek şekilde genişletmelisiniz ve büyük olasılıkla bozmalısınız .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.