Tại sao định nghĩa create_foo () trong mô hình Django. Quản lý thay vì ghi đè tạo ()?


10

Đọc tài liệu Django , nó khuyên bạn nên tạo một phương thức tạo tùy chỉnh cho một mô hình được đặt tên Foobằng cách định nghĩa nó như create_footrong trình quản lý:

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

Câu hỏi của tôi là tại sao cái trước được ưa thích chỉ đơn giản là ghi đè createphương thức của lớp cơ sở :

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 có vẻ như chỉ ghi đè createsẽ ngăn bất kỳ ai vô tình sử dụng nó để tạo một ví dụ mô hình không phù hợp, vì create_fooluôn có thể được bỏ qua hoàn toàn:

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

Có bất kỳ lợi thế nào khi làm điều đó như các tài liệu đề xuất, hoặc thực sự ghi đè createchỉ là khách quan tốt hơn?

Câu trả lời:


10

Vâng, rõ ràng, bạn có thể làm điều đó. Nhưng nếu bạn nhìn gần hơn với ví dụ bạn đang trích dẫn từ tài liệu, thì đó không phải là về việc bạn có nên ghi đè tạo hay không, mà là về

Tuy nhiên, nếu bạn làm như vậy, hãy cẩn thận không thay đổi chữ ký gọi vì mọi thay đổi có thể ngăn không cho phiên bản mô hình được lưu.

giữ chữ ký gọi . Bởi vì các giao diện có sẵn cho bạn cũng có thể được sử dụng bởi django trong nội bộ. Nếu bạn sửa đổi chúng, mọi thứ có thể không phá vỡ đối với bạn nhưng đối với Django.

Trong ví dụ này, họ không đề xuất điều này cho createnhưng người xây dựng mô hình.

Thứ hai , ngay cả giao diện tiêu chuẩn cho createchỉ lấy tham số từ khóa

def create(self, **kwargs):

Nhưng nếu bạn sửa đổi nó để lấy các đối số vị trí, def create(self, title):nó sẽ phá vỡ bất cứ nơi nào nó được sử dụng bên trong Django hoặc theo cách tiêu chuẩn. Vì vậy, bạn nên mở rộng chức năng hiện có không sửa đổi và rất có thể phá vỡ nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.