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)
[' ', ' ']
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.