create ()를 재정의하는 대신 Django models.Manager에서 create_foo ()를 정의해야하는 이유는 무엇입니까?


10

Django docs를 읽으면 관리자 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")

Imo 그것은 재정의만 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를 재정의 해야하는지 아닌지에 관한 것이 아닙니다.

그러나 변경하면 모델 인스턴스가 저장되지 않을 수 있으므로 호출 서명을 변경하지 않도록주의하십시오.

호출 서명 유지 . django는 내부에서 사용 가능한 인터페이스를 사용할 수도 있습니다. 수정하면 Django가 아닌 문제가 발생할 수 있습니다.

이 예제에서는 create모델 생성자 를 제안하지 않습니다 .

둘째 , 표준 인터페이스조차도 create키워드 인수 만 취합니다.

def create(self, **kwargs):

그러나 위치 인수를 사용하도록 수정하면 def create(self, title):장고 내에서 또는 표준 방식으로 사용되는 곳마다 중단됩니다. 당신이해야한다 그래서 확장 기능을 존재하지 않는 수정 및 아마 휴식 을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.