Django Basic 1-5) ORM(Object Relational Mapping)

Turtle·2023년 12월 20일
0
post-thumbnail

📌적용

def view_poll_by_id(request, id):
    # get : 데이터를 하나 특정해서 가져온다.
    topic = Topic.objects.get(id=id)
    # filter : 특정 조건과 일치하는 레코드들을 조회한다.(검색기능에 사용되는 메소드)
    options = Option.objects.filter(topic=topic).all()

    total_votes = Vote.objects.filter(topic=topic).count()
    results = {}
    for item in options:
        vote_count = Vote.objects.filter(option=item).count()
        # ZeroDivisionError 방지
        if total_votes > 0:
            rate = vote_count / total_votes * 100
            result_text = "투표 수: %d, 득표율: %.2f%%" % (vote_count, rate)
        else:
            result_text = "투표 없음"
        results[item.name] = result_text

    context = {
        'topic' : topic,        # topic은 문자열 형태
        'results' : results,    # results는 딕셔너리 형태로 템플릿에서 키와 값을 구분지어 받을 예정
    }
    return render(request, 'votes/view_poll_by_id.html', context)

📌Retrieving all objects

  • 테이블에서 개체를 검색하는 가장 간단한 방법은 해당 개체를 모두 가져오는 것이다. 해당 개체를 모두 가져오기 위해서 all() 메소드를 사용한다.
>>> all_entries = Entry.objects.all()
  • all() 메소드는 데이터베이스에 있는 모든 객체의 QuerySet을 반환한다.

📌Retrieving specific objects with filters

  • all()이 반환한 QuerySet은 데이터베이스 테이블의 모든 개체를 설명한다. 대개 일반적으로 전체 개체 집합 중 하위 집합만 사용하면 된다.

  • 이러한 하위 집합을 만들기 위해서 초기 QuerySet을 구체화하고 필터 조건을 추가한다. QuerySet을 구체화하는 가장 일반적인 두 가지 방법은 아래와 같다.

    • filter(**kwargs)
      : 주어진 조회 매개변수와 일치하는 객체를 포함하는 새로운 QuerySet을 반환한다.
    • exclude(**kwargs)
      : 주어진 조회 매개변수와 일치하지 않는 객체가 포함된 새로운 QuerySet을 반환한다.
>>> Entry.objects.all().filter(pub_date__year=2006)
  • 위와 같이 조건을 설정해 하위 집합을 만드는 방법이 있지만 체이닝을 이용해서도 조건을 설정할 수 있다.

📌Retrieving a single object with get()

  • filter()는 단일 개체만 쿼리와 일치하더라도 항상 QuerySet을 제공한다. 이 경우 단일 요소를 포함하는 QuerySet이 된다. 쿼리와 일치하는 개체가 하나만 있다는 것을 알고 있는 경우 객체를 직접 반환하는 get()을 사용할 수 있다.

  • get()을 사용하는 방법과 슬라이싱의 [0]을 이용한 filter()를 사용하는 것은 차이가 있다. 쿼리와 일치하는 결과가 없다면 get()DoesNotExist 예외를 발생시킨다. 이 예외는 쿼리가 수행되는 모델 클래스의 속성이다.

>>> one_entry = Entry.objects.get(pk=1)
  • 위와 같은 코드에서 기본키가 1인 개체를 탐색하려고 한다. get()을 이용한 경우 만약, 기본키가 1인 Entry 모델의 개체가 없다면 Django는 DoesNotExist를 발생시킨다.

  • 또한 get()은 단일 개체에 대한 QuerySet을 제공한다는 점을 보았을 때 만약 둘 이상의 항목이 일치한다면 Django에서는 MultipleObjectsReturned 에러가 발생한다.

0개의 댓글