django 데이터베이스 조작

django 데이터베이스 조작
  • 삽입문
  • 조회 조작
  • 쿼리 세트
  • all(),count(),get()
  • 필터 필터 exclude
  • 날짜에 따른 일부 값 조회
  • 필드 쿼리
  • 크로스 테이블 조회(크로스 테이블 조회)
  • F 객체
  • Q 개체
  • 일대다 쿼리
  • 여러모로 외부 키를 정의할 때 related 를 지정하면name, relatedname 쿼리
  • 집선
  • 비교 대상
  • 객체 삭제
  • 업데이트
  • ForeignKey 및 ManyToManyField 필드 저장
  • 트랜잭션
  • 삽입문
  • save는 데이터베이스에 쓰기 위해save를 호출해야 한다
  • q = Question(question_text="what's your name?",pub_date=date)
    q.save()
    
  • create는sace
  • 를 호출할 필요가 없습니다.
    Question.objects.create(question_text="what's your name?",pub_date=date)
    

    조회 작업
    조회 집합
    필터 방법을 호출할 때,django는 조회 집합을 되돌려줍니다. 조회 및 두 가지 특성이 있습니다
  • 타성 실행 조회 집합은 데이터베이스에 접근하지 않고 데이터를 호출할 때까지 데이터베이스에 접근하지 않는다. 호출 데이터의 경우 교체, 서열화,if와 합용
  • 을 포함한다.
  • 캐시는 같은 조회 집합을 사용한다. 처음 사용할 때 데이터베이스 조회가 발생하고 Django는 결과를 캐시한다. 이 조회 집합을 다시 사용할 때 캐시된 데이터를 사용하여 데이터베이스 조회 횟수를 줄인다.
  • 캐시를 정확하게 사용해야 한다. 예를 들어 다음과 같은 내용으로 두 개의QuerySets를 생성하여 데이터베이스 부하를 배로 늘린다
    print([e.headline for e in Entry.objects.all()])
    print([e.pub_date for e in Entry.objects.all()])
    
    . 정확한 방법은 조회 집합을 저장하는 것이다. 아래
    queryset = Entry.objects.all()
    print([p.headline for p in queryset]) # Evaluate the query set.
    print([p.pub_date for p in queryset]) # Re-use the cache from the evaluation.
    
  • 단순 슬라이드[0:5]만 지원, [5:10], step는 지원되지 않으며 음수 슬라이드는 지원되지 않으며 상기 조회 집합의 진열 슬라이드나 인덱스 사용을 제한하여 캐시를 채우지 않습니다.

  • queryset = Entry.objects.all() print(queryset[5]) # Queries the database print(queryset[5]) # Queries the database again
      ,            ,      :
    

    queryset = Entry.objects.all() [entry for entry in queryset] # Queries the database print(queryset[5]) # Uses cache print(queryset[5]) # Uses cache
    다음은 전체 쿼리 세트가 평가되고 캐시가 채워지는 다른 작업의 예입니다.
    [entry for entry in queryset] bool(queryset) entry in queryset list(queryset)
    all(),count(),get()
  • all(): 모든 객체, MyModel을 읽어들입니다.objects.all () 조회 집합 되돌아오기
  • count(): 검색 대상 수, MyModel.objects.count() 반환 정형
  • get()은 단일 대상을 되돌려줍니다. 그러나 필터와 달리 필터는 결과를 조회하지 못했을 때 빈 쿼리 집합을 되돌려주고 get은 DoesNotExist 이상을 던집니다.질의 결과가 1보다 크면 MultipleObjectsReturned 예외가 발생합니다.단일 검색에만 적용되며, 일반적으로 메인 키를 통과합니다.


  • 필터 필터 exclude
    조회 집합 및 관리자에서 필터를 호출할 수 있습니다
    날짜의 일부 값에 따라 조회하다
    #    year month day hour minute second
    User.objects.filter(birthday__year=2010)
    

    필드 쿼리
    기본 키워드 찾기 매개 변수는 폼field 을 사용합니다lookuptype=value
    lookuptype
    instruction
    mean
    lte
    <=
    less then or equal
    gte
    >=
    greater then or equal
    id,pk
    id
    id
    exact
    =
    완전히 같다
    iexact
    =
    대소문자 구분 없음
    contains
    포함
    포함, sql에서like "xx%"
    startswith, endswith
    처음
    istartswith, iendswith, 대소문자를 구분하지 않는 버전
    in
    범위 조회
    테이블 간 조회(관계 간 조회)
    공식 문서 Django는 검색 중인 관계를 추적하는 강력하고 직관적인 방법을 제공합니다. JOIN은 백엔드에서 자동으로 SQL을 처리합니다.관계를 뛰어넘으려면 모형과 관련된 필드의 이름을 사용하고 필요한 필드에 도달할 때까지 두 밑줄로 구분해야 한다.
    Order.objects.filter(user__name='Lisa')
    

    #여러 관계식에 걸쳐 필터링을 수행하고 중간 모델 중 하나가 필터 기준을 충족하는 값이 없으면 Django는 빈 값(모든 값이 NULL)으로 간주하지만 유효한 객체가 있습니다.이 모든 것은 어떤 잘못도 일으키지 않는다는 것을 의미한다.예를 들어, 이 필터에서 다음을 수행합니다.
    Blog.objects.filter(entry__headline__contains='Lennon')
    

    (관련 Author 모델이 있는 경우) author가 항목과 연결되어 있지 않으면, 부족한 것으로 인해 오류가 발생하는 author가 아니라name 부가가치가 없는 것으로 간주합니다.보통 이것이 바로 네가 일으키고 싶은 일이다.유일하게 곤혹스러울 수 있는 상황은 당신이 그것을 사용하고 있다는 것이다.따라서
    Blog.objects.filter(entry__authors__name__isnull=True)
    

    Blog에 빈 대상name에 있는 author와 빈 author가 있는 entry를 되돌려줍니다.만약 뒤에 있는 대상을 원하지 않는다면, 당신은 다음과 같이 쓸 수 있습니다.
    Blog.objects.filter(entry__authors__isnull=False, entry__authors__name__isnull=True)
    

    F 객체
    지금까지 제시한 예에서 우리는 모델 필드의 값과 상수를 비교하는 데 사용할 필터를 구성했다.그러나 모델 필드의 값을 같은 모델의 다른 필드와 비교하려면 어떻게 해야 합니까?
    Django는 이러한 비교를 허용합니다.조회에서 모델 필드를 인용하는 실례입니다.그리고 검색 필터에서 이 인용을 사용하여 같은 모델의 실례에 있는 두 필드의 값을 비교할 수 있습니다.F expressionsF()
    from django.db.models import F #   F  
    #                
    Question.objects.filter(comments__gt=F('clicks'))
    

    Q 개체
    Filter 필터를 할 때, 조건은 and에 따라 연결되며, or를 사용해야 할 경우,django가 제공하는 Q 대상을 사용해야 합니다.아래와 같다
    Q(question__startswith='Who') | Q(question__startswith='What')
          SQL WHERE  :
    WHERE question LIKE 'Who%' OR question LIKE 'What%'
    

    ~Q(pub date year=2005) #은 키워드 매개 변수와 Q 대상을 동시에 사용하지 않으면 Q 대상을 검색 문장 앞에 두어야 한다는 뜻입니다. 이 문장은 이상을 던집니다. SyntaxError:positional argument follows keyword argument Question.objects.filter(question text startswith="w", Q(id=1)|Q(id=4)) 올바른 쓰기 방법은:Question입니다.objects.filter(Q(id=1)|Q(id=4),question_text__startswith=“w”)
    일대다 조회
    한 측에서 존재 관계의 다방면을 조회하다
    Question.objects.get(pk=1).choice_set.all()
    여러모로 외부 키를 정의할 때,related 를 지정하면name, related질의
    Question.objects.get(pk=1).choices.all()
    다방면으로 한 측을 조회하면 직접 이 속성을 호출하면 된다
    Choice.objects.get(pk=1).question
    QuerySet 위의 객체 읽어들이기에 정의된 방법 외에도 관련 객체 세트를 처리하는 데 사용되는 다른 방법이 있습니다.모든 개요는 다음과 같습니다. 완전한 세부 사항은 관련 대상의 참고에서 찾을 수 있습니다.ForeignKey Manager
    dd(obj1,obj2,...)는 특정한 모델 대상을 관련 대상 집합에 추가합니다.create(*kwargs)에서 새 대상을 만들고 저장하여 관련 대상에 넣습니다.새로 만든 객체를 반환합니다.remove(obj1,obj2,...) 관련 대상에서 지정한 모델 대상을 집중적으로 삭제합니다.clear () 는 관련 대상에서 모든 대상을 집중적으로 삭제합니다.관련 객체 세트를 set(objs)으로 대체합니다.
    취합
    # 모든 책의 평균가격 from django.db.models import Avg Book.objects.all().aggregate('price') # 모든 책의 최고 가격 from django.db.models import Max Book.objects.all().aggregate(Max('price')#최고가격과 평균가격의 차치Book.objects.all().aggregate(Max(‘price’,output_field=FloatField())-Avg(‘price’))
    annotate 관계 조회에 사용할 집합
    비교 대상
    두 모델 객체의 == 비교, 기본 키 비교
    some_entry == other_entry some_entry.id == other_entry.id
    객체 삭제
    object.delect() queryset.delect() # 쿼리 세트 호출 delete, 대량 삭제
    업데이트
    obj.name = “xxx” obj.save() or obj.update(name=“xxx”)
    ForeignKey 및 ManyToManyField 필드 저장
    #    
    from blog.models import Blog, Entry
    >>> entry = Entry.objects.get(pk=1)
    cheese_blog = Blog.objects.get(name="Cheddar Talk")
    entry.blog = cheese_blog
    entry.save()
    
    #        ,  add()
    john = Author.objects.create(name="John")
    paul = Author.objects.create(name="Paul")
    george = Author.objects.create(name="George")
    ringo = Author.objects.create(name="Ringo")
    entry.authors.add(john, paul, george, ringo)
    

    실무, 일, 총무
    공식 문서

    좋은 웹페이지 즐겨찾기