73. Python의 ORM 컬렉션 함수 상세 정보: Count

4844 단어

Count: 데이터의 개수를 구하는 데 사용됩니다.


다음 모든 예제에서 사용되는 모델은 다음과 같습니다.

from django.db import models


#  
class Author(models.Model):
    name = models.CharField(max_length=100, unique=True)
    age = models.IntegerField()
    email = models.EmailField()

    class Meta:
        db_table = 'author'

    def __str__(self):
        return "%s,%s,%s" % (self.name,self.age, self.email)


#  
class Publisher(models.Model):
    name = models.CharField(max_length=100,unique=True)

    class Meta:
        db_table = 'publisher'


#  
class Book(models.Model):
    name = models.CharField(max_length=100, unique=True)
    pages = models.IntegerField()
    price = models.FloatField()
    rating = models.FloatField()
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)

    class Meta:
        db_table = 'book'


#  
class BookOrder(models.Model):
    book = models.ForeignKey('Book', on_delete=models.CASCADE)
    price = models.FloatField()

    class Meta:
        db_table = 'book_order'

1. 예: 모든 도서의 수량을 구하면views.py 뷰 파일에서는 다음 코드를 사용할 수 있습니다.

from django.http import HttpResponse
from .models import Author,Publisher,Book,BookOrder
from django.db.models import Avg,Count,Sum
from django.db import connection


def index(request):
# 4. , book ID 。
    count = Book.objects.aggregate(book_count=Count('id'))
    print(count)
    #  :{'book_count': 4}
    return HttpResponse("success !")

2. 같은 책 예약 수량 구하기

from django.http import HttpResponse
from .models import Author,Publisher,Book,BookOrder
from django.db.models import Avg,Count,Sum
from django.db import connection


def index(request):
# 5. , book , bookorder__id, bookorder。 book__order id 
    books = Book.objects.annotate(books_count=Count('bookorder'))
    # print(type(books))
    # 
    #  QuerySet
    for book in books:
        print("%s,%s" % (book.name,book.books_count))
    #  :
    #  ,2
    #  ,2
    #  ,2
    #  ,0
#  SQL 
    print(connection.queries)
#  :[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'}, {'sql': 'SELECT `book`.`id`, `book`.`name`, `book`.`pages`, `book`.`price`, `book`.`rating`, `book`.`author_id`, `book`.`publisher_id`, COUNT(`book_order`.`id`) AS `books_count` FROM `book` LEFT OUTER JOIN `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL', 'time': '0.000'}]
    return HttpResponse("success !")

3. 같은 Count()는 매개 변수 distinct를 전달할 수 있습니다. 기본적으로distinct=False.distinct=True를 지정하여 반환 값에서 같은 데이터를 삭제할 수 있습니다.예를 들어 예약된 책이 몇 가지인지 구하려면 예제 코드는 다음과 같습니다.

from django.http import HttpResponse
from .models import Book
from django.db.models import Count


def index(request):
# 6. 
#  annotate() , 。
    book_nums = Book.objects.annotate(book_nums=Count('bookorder', distinct=True))
    print(book_nums)
    return HttpResponse("success !")

인쇄 결과:
출력된 결과는 QuerySet 객체로 구체적인 데이터 정보를 쉽게 구분할 수 없습니다.따라서 우리는 Book 모델의 __str__(self) 방법으로 다시 쓰기를 진행합니다.
, 
, 
, 
]>

모델의 __ 다시 쓰기str__(self) 메서드:

#  
class Publisher(models.Model):
    name = models.CharField(max_length=100,unique=True)

    class Meta:
        db_table = 'publisher'

    def __str__(self):
        return " ->:%s" % self.name


#  
class Book(models.Model):
    name = models.CharField(max_length=100, unique=True)
    pages = models.IntegerField()
    price = models.FloatField()
    rating = models.FloatField()
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)

    class Meta:
        db_table = 'book'

    def __str__(self):
        return "( :%s, :%s, :%s, :%s, :%s, :%s)" % (self.name, self.pages, self.price, self.rating, self.author, self.publisher)

인쇄 결과:
: )>, 
: )>, 
: )>, 
: )>
]>

좋은 웹페이지 즐겨찾기