Django - ORM 사용 레코드(둘)

5470 단어
ORM 질의
  • queryset과objects 대상
  • 1.queryset은 검색 집합입니다. 서버에 전송된 URL의 내용입니다.Django는 조회가 되돌아오는 결과집인 QerySet을 캐시합니다. 여기는 조회 효율을 높이기 위해서입니다. 즉, QuerySet 대상을 만들 때 Django는 데이터베이스에 조회 명령을 즉시 보내지 않습니다. 이QuerySet을 사용할 때만 데이터베이스 조회
  • 로 돌아갑니다.
  • 2.Objects는django가 구현한 mvc 프레임워크의 데이터층(model) m이고,django의 모델 클래스는 모두 Objects 대상이 있으며, 이것은django에서 정의한QuerySet 유형의 대상이며, 모델 대상의 실례를 포함한다.간단하게 말하면 Objects는 단일 대상이고queryset은 많은 대상
  • 3.QuerySet은 구성, 필터, 슬라이드, 매개 변수로 전달될 수 있으며, 이러한 행위는 데이터베이스에 대해 조작되지 않는다.네가 조회할 때만 진정으로 데이터베이스를 조작할 수 있다

  • 관리자 방법
    반환 유형
    설명
    모델 클래스.objects.all()
    QuerySet
    테이블의 모든 데이터 반환
    filter()
    QuerySet
    해당 데이터 반환
    values()
    ValuesQuerySet(QuerySet의 하위 클래스)
    하나의 목록을 되돌려줍니다. 요소마다 사전입니다.
    values_list()
    ValuesListQuerySet(QuerySet의 하위 클래스)
    목록을 되돌려줍니다. 그러나 그 요소는 사전이 아니라 원조입니다.
    get()
    모델 개체
    조건을 충족시키는 대상 되돌리기;조건에 맞는 대상을 찾지 못하면 모델류를 일으킬 수 있습니다.DoesNotExist 예외,여러 개를 찾으면 모델류를 일으킬 수 있습니다.MultiObjectsReturned 예외
    first()
    모델 개체
    첫 번째 데이터 반환
    last()
    모델 개체
    마지막 데이터 반환
    exclude()
    QuerySet
    부적합한 데이터 반환
    order_by()
    QuerySet
    질의 결과 세트 정렬
    reverse()
    QuerySet
    정렬 결과 반전
    count()
    int
    질의 세트의 객체 수를 반환합니다.
    exists()
    bool
    조회된 데이터가 존재하는지 판단하다
  • 1.len () 과count ()
  • QuerySet 요소의 수량을 계산하려면len()을 사용하는 것을 추천하지 않습니다. QuerySet이 값을 구한 경우(즉evaluated)가 아니라면QuerySet을 사용합니다.count()에서 원소 수량을 얻는 효율이 매우 높다. 특히 데이터량이 많을 때
  • 2.if QuerySet:if QuerySet.exists()
  • 마찬가지로 if QuerySet 이런 방법으로 빈 것인지 아닌지를 판단하는 것을 권장하지 않고QuerySet을 사용해야 한다.exists(), 조회 효율 높음
  • 3.F-클래스
  • from django.db import models
    from django.db.models import F
    
    class User(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
        both = models.CharField(max_length=20)
    

    F() 사용하지 않음
    s = User.objects.get(name='xxx')
    s.age += 1
    s.save()
    

    대상을 데이터베이스에서 찾아내 메모리에 넣은 후 계수하여 데이터베이스에 저장한다
    F() 사용
    s = User.objects.get(name='xxx')
    s.age = F('age') + 1
    s.save()
    

    직접 데이터베이스에서 데이터를 찾아내고 계수한 후 데이터베이스를 변경합니다
  • Q클래스-대응(and/or/not)
  • or 등 논리적 관계가 있다면 Q류
  • Filter의 조건은 Q 대상과 비 Q 조회를 혼합하여 사용할 수 있지만 이렇게 하는 것을 권장하지 않는다. 혼합 조회를 할 때 Q 대상을 앞에 놓아야 하기 때문에 순서를 잊어버리고 오류가 발생할 수 있기 때문에 Q 대상을 사용하면 모두 Q 대상
  • 을 사용한다.
  • Q 대상도 간단하다. 바로 원래 Filter의 각 조건을 각각 하나의 Q()에 놓으면 된다. 그러나 우리는 사용하거나 사용하지 않을 수 있다. 각각 대응하는 기호는'|'와'&'와'~'이다. 그리고 이런 논리적 조작이 되돌아오는 것은 하나의 Q 대상이다. 또한 쉼표는 각 그룹의 조건의 기본적인 연결부호이자 과의 관계이다.사실은 &대체(python manage.py 셸에서 테스트한 적이 있고 & 쉼표 대신 SQL을 실행한 것은 같다)를 사용할 수 있다. 그러나 그러면 가독성이 떨어질 수 있다. 이것은 우리가 직접 SQL을 쓸 때 각 그룹의 조건 and를 사용할 때 줄을 바꾸는 것과 같이 논리가 명확하다
  • >>> python manage.py shell
    >>> from django.db.models import Q
    >>> Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who')   #   ,       
    >>> Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    Q(question__startswith='Who'))  #   ,   Q  
    >>> Poll.objects.get( (Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))&
    Q(question__startswith='Who'))  #        ,&  ”,”,    
    

    Q 클래스 중 F 클래스를 사용할 수 있습니까?관심 있는 거 해보셔도 돼요.
  • annotate(SQL 키워드 없음)
  • 함수annotate(*args, **kwargs): QuerySet
  • 을 반환합니다.
  • 모든 QuerySet의 모델 instance에 한 개 이상의 필드를 추가합니다. 필드 값은 집합 함수일 수 있습니다. annotate를 사용할 때 그룹 by를 사용하기 때문에 집합 함수만 사용할 수 있습니다.집합 함수는 Filter처럼 표를 연결할 수 있다. 즉, 집합 함수에서 Django는 OneToOne, OneToMany, ManyToMany 관련 조회와 그 반대 관련에 대해 같은 방식을 제공했다

  • 예:
    from django.db.models import Count
    s = User.objects.all().annotate(n=Count('age'))
    
  • 5.order_by()
  • 필드 이름을 직접 사용하면 승차순 asc 배열입니다.필드 이름이 앞에 -이면 내림차순 desc
  • QuerySet 반환
  • 6.distinct()
  • 일반과values(),valueslist () 를 연결하면,ValuesQuerySet,ValuesListQuerySet을 되돌려줍니다. 이 클래스는 목록과 비슷합니다. 요소마다 사전입니다.
  • 이것은 파라미터가 없다(사실 파라미터가 있지만 파라미터는 PostgreSQL에서만 작용한다) 예:
  • s = User.objects.values('name').distinct()
    
  • 7.aggregate
  • aggregate(*args,**kwargs): 매개 변수는 집합 함수로 **kwargs의 형식으로 매개 변수마다 이름을 짓는 것이 좋다
  • annotate는aggregate()와group 에 해당한다by의 결합, 그룹마다 aggregate () 함수를 실행합니다.단독aggregate()는 그룹이 없습니다by

  • from django.db.models import Count
    #    *args   ,       
    s = User.objects.aggregate(Count('name'))
    #    **kwargs   
    s = User.objects.aggregate(n=Count('name'))
    
  • 8.모호한 조회
  • gt/gte/lt/lte대응>,>=,:
    • age__gt=18: 나이가 18보다 많음
    • in대응 in: 필드 이름에 더블 밑줄
    • contains/startswith/endswith대응like: 필드명에 쌍밑줄
    • range대응between and: 필드 이름에 더블 밑줄을 긋고range 뒷면값은 목록
    • extra()
    • extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
    • 복잡한where 문장을 실현하고 extra에서 select,where,tables 등 하나 이상의 파라메스 매개 변수를 지정할 수 있습니다.모든 매개 변수는 선택할 수 있지만, 최소한 간단한 예시를 사용해야 한다.
    • s = User.objects.extra(select={'is_recent':"both>'2000-01-01'"})s
      
  • 좋은 웹페이지 즐겨찾기