Django의 Manager 클래스

3449 단어 python
매니저 클래스
django의 매니저 클래스는 모델 클래스를 통해 데이터베이스를 조작하는 도구입니다.django는 모든 정의된 모델에 기본적으로 Objects라는 관리자 클래스를 추가합니다.관리자에 대한 django 공식 홈페이지 문서의 개요는 다음과 같습니다.
` A Manager is the interface through which database query operations are provided to Django models.At least one Manager exists for every model in a Django application.

먼저 관리자에 대한 기본적인 사용을 보고 기본적인 도서 정보 종류를 정의한다.
    class BookInfo(models.Model):
        btitle = models.CharField(max_length=20)
        bpub_date = models.DateField()
        bread = models.IntegerField(default=0)
        bcomment = models.IntegerField(default=0)
        bisDelete = models.BooleanField(default=False)
        def __str__(self):
            return self.btitle

다음에 우리는 BookIno의 모든 도서를 조회할 것이다. (조회문과 결과는 다음과 같다.)
>>> BookInfo.objects.all()
[, , , ]

상기 조회 문구를 실행한 후에 만약에 우리가 지금 또 한 클라이언트의 요청을 받았다면'설산비호'라는 책을 삭제하고 다음 코드를 실행하여 데이터베이스에 대해 논리적 삭제 작업을 수행해야 한다.
book = BookInfo.objects.get(btitle='    ')
book.bisDelete = 1
book.save()

앞으로 우리가 모든 도서에 대한 정보를 조회할 때 삭제된 도서를 삭제해야 한다.한 가지 방법은 매번 모든 도서 정보를 조회한 다음bisDelete=1의 필드를 제거하는 것이다.
>>> BookInfo.objects.all().exclude(bisDelete=1)
[, , ]

그러나 우리는 매번 조작할 때마다 위의 코드를 한 번 써야 하기 때문에 너무 번거롭다. 그리고 모든 도서 정보를 조회할 때 삭제된 도서의 정보를 기본적으로 삭제한다. Objects라는 관리자 클래스의 all 방법은 모든 정보를 되돌려 주는 것이다. 우리의 요구를 만족시키지 못할 것이다. 이럴 때 우리는 사용자 정의 관리자 클래스를 만들어서 all () 방법을 다시 실현해야 한다.
사용자 정의 관리자 클래스
    class BookManager(models.Manager):
        #     all  
        def all(self):
            all_data = super().all()
            return all_data.exclude(bisDelete=1)

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateField()
    bread = models.IntegerField(default=0)
    bcomment = models.IntegerField(default=0)
    bisDelete = models.BooleanField(default=False)
    def __str__(self):
        return self.btitle
    #          (     objects         )
    bmanager = BookManager()

#        

>>> BookInfo.bmanager.all()
[, , ]

관리 클래스 기능 확장
앞에서 우리는 사용자 정의 관리자 클래스를 통해 기존의 all() 방법을 확장했다. 그러나 때때로 우리가 원하는 기능은 관리자 클래스에서 상응하는 방법이 없을 뿐만 아니라 유사한 계승 확장 방법도 없다. 이럴 때 우리는 완전히 사용자 정의 방법을 해야 한다.예를 들어 다음 장면에서 우리는 매번 받은 반환 결과가QuerySet 유형의 집합 대상이 되기를 원하지 않는다. 우리는 매번 조회할 때마다 조건을 충족시키는 도서 이름을 포함하는 목록이 되기를 바란다.이때 우리는 사용자 정의 관리자 클래스에서 우리가 요구하는 방법에 완전히 적합한 방법을 정의할 수 있다. (사실 이러한 사용자 정의 확장 방법의 본질은 Manager 관리 클래스의 검색 결과에 대한 필터 동작을 클래스 밖에서 관리 클래스 내부로 옮기는 것이다.)
    class BookManager(models.Manager):
        #       id      
        def blist(self,id):
            ls = []
            all_data = super().filter(id__gt=id)
            for book in all_data:
                ls.append(book.btitle)
            return ls
    #    
    >>> BookInfo.bmanager.blist(2)
        ['    ', '    ']

좋은 웹페이지 즐겨찾기